Java 返回字符串中第一个不重复字符的下标 下标从0开始

Posted qianjinyan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 返回字符串中第一个不重复字符的下标 下标从0开始相关的知识,希望对你有一定的参考价值。

比如abcdefgabdef

其中字符c和g不重复,返回c的小标,下标从0开始,那么是2

 

package com.example.demo;

import org.testng.annotations.Test;

import java.util.ArrayList;
import java.util.LinkedHashSet;

public class Test111 


    String str1 = "abcdefgabdef";

    @Test
    public void fun1()
    //LinkedHashSet  有序的set集合
        LinkedHashSet<Character> once = new LinkedHashSet<>();
        LinkedHashSet<Character> chongFu = new LinkedHashSet<>();
        ArrayList<Character> list = new ArrayList<>();


        for (int i = 0; i < str1.length(); i++) 
            boolean add = once.add(str1.charAt(i)); // 得到集合里所有出现过一次的元素

            if (!add) 
                chongFu.add(str1.charAt(i));// 得到集合里重复出现的元素
            
        

        boolean removeAll = once.removeAll(chongFu); // once里将存储所有不重复的元素
        list.addAll(once);
        System.out.println("所有不重复的字母:" + list);
        for (int i = 0; i < str1.length(); i++) 
            if (list.get(0) == str1.charAt(i)) 
                System.out.println("它的索引为:" + i);
            
        
    

    @Test
    public void fun2()
        ArrayList<Character> list = new ArrayList<>();
        for (int i = 0; i < str1.length(); i++) 
            int flag = -1;// 定义一个标志
            for (int j = 0; j < str1.length(); j++) 
                if (i == j) // 如果是同一个元素跳过本次循环,继续下次循环
                    continue;
                
                // 如果这个元素不是第一次出现,将标志改变
                if (str1.charAt(i) == str1.charAt(j)) 
                    flag = 1;
                
            
            // 未改变标志的元素,即只出现一次的元素
            if (flag == -1) 
                list.add(str1.charAt(i));
             // if

         // for
        System.out.println("所有不重复的字母:" + list);
        System.out.println("第一个不重复的字母为:" + list.get(0));
        for (int i = 0; i < str1.length(); i++) 
            if (list.get(0) == str1.charAt(i)) 
                System.out.println("它的索引为:" + i);
            
        
    

    @Test
    public void fun3()
        for (int i = 0; i < str1.length(); i++) 
            char charAt = str1.charAt(i);
            // 找出取出的元素第一次出现的位置
            int indexOf = str1.indexOf(charAt);
            // 找出取出的元素最后一次出现的位置
            int lastIndexOf = str1.lastIndexOf(charAt);
            // 如果是唯一的元素,第一次出现的位置和最后一次出现的位置应该相同
            // 如果相同了就没必要在继续走for循环了
            if (indexOf == lastIndexOf) 
                System.out.println(str1.charAt(indexOf));
                System.out.println(indexOf);
                return;
            
        
    

 

 

BF算法
BF算法,即Brute Force 算法的简称。用于检测某个字符串是否是另一个字符串的子串。

子串的概念#
假设字符串 X = ‘girlfriend‘ , Y = ‘friend‘ ,那么Y 就是 X的子串。同样的,end是friend的子串。

BF算法的思路#
BF算法的思路非常简单粗暴,就是从前到后一点点的匹配。例如: 子串 x= abcd | 主串为 y = abdabceabcde
如果 x[0] = y[0] 继续比较 x[1] y[1] 继续下去,如果一直到 x[3]= y[3]时 则 x 整个串都匹配上了。
如果 x[0] = y[0] 继续比较 x[1] y[i] 发现不等,那么就开始用 x[0] 比较 y[1] 然后继续 x[1] y[2]。

public class TestBF 

    public static void main(String[] args) 
        System.out.println(isSubstring("abdabceabcde","abcd")); // true
        System.out.println(isSubstring("abdabceabcde","ff"));   // false
    

    private static boolean isSubstring(String main,String sub)
        if(main == null || sub == null) 
            return false;
        
        if(main.length() < sub.length())  // 子串不可比主串长
            return false;
        
        if(main.equals(sub))  // 主串,子串 相等的情况
            return true;
        
        int len = main.length() - sub.length();
        for (int i = 0; i < len; i++) 
            boolean match = true;
            for (int j = 0; j < sub.length(); j++) 
                if(main.charAt(i+j) != sub.charAt(j)) 
                    match = false;
                    break;
                
            
            if(match) 
                return true;
            
        
        return false;
    


  

  

以上是关于Java 返回字符串中第一个不重复字符的下标 下标从0开始的主要内容,如果未能解决你的问题,请参考以下文章

算法leetcode|28. 找出字符串中第一个匹配项的下标(rust重拳出击)

算法leetcode|28. 找出字符串中第一个匹配项的下标(rust重拳出击)

用Java找出一个整数数组中最大的值,并返回最大值的数组下标,尤其是有两个或是三个最大值时

如何用Java找出一个整数数组中最大的值,并返回最大值的数组下标,尤其是有两个或是三个最大值时?

第一个独特字符位置 · first position unique character

Swift 4:不推荐使用 substring(with:)':请使用字符串切片下标 [重复]