字符串中的第一个唯一字符

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

案例:

s = "leetcode"
返回 0.

s = "loveleetcode",
返回 2.

注意事项:您可以假定该字符串只包含小写字母。

思路1

用s[i]-'a'作为数组flag的下标,当s[i]有相同的字符时,相对应的flag[s[i]-'a']的值就会加1,而当s[i]只有一个字符时,相对应的flag[s[i]-'a']的值为1

int firstUniqChar(char* s) {

    int  flag[26]={0};
    int length=strlen(s);
    for(int i=0;i<length;++i){
        flag[s[i]-'a']+=1;
    }
    
     for(int i=0;i<length;++i){
         if(flag[s[i]-'a']==1){
             return i;
         }
     }
    return -1;
}

思路2

对26个字母进行遍历,indexOf(c)方法返回字符c匹配的第一个位置,lastIndexOf(c)方法返回字符c匹配的倒数第一个位置,如果返回值为-1,说明没有这个字符,如果这两个相同,说明该字符只有一个,而只有单个的字符,可能有多种,所以还需min变量存储下标最小的数。

class Solution {
    public int firstUniqChar(String s) {
        int min=-1;
        for(char c='a';c<='z';++c){
            int pre=s.indexOf(c);//-1
            int last=s.lastIndexOf(c);
            
            if(pre!=-1&&(pre==last)){//存在的字符,求出来的都是只出现一次的字符,但这样的字符可能会有多个
                if(min==-1){
                    min=pre;
                }
                if(min>pre){
                    min=pre;
                }
                
            }
        }
        if(min==-1){
            return -1;
        }
        return min;
        
    }
}

思路3

对每个字符进行遍历,拿第一个字符去比较剩下的字符,看是否相等,如比到最后一个字符还是不相等,则该字符就是单次出现,如果相等,则轮到第二个字符去比较剩下的字符,以此类推

class Solution {
    public int firstUniqChar(String s) {
        char []str=s.toCharArray();
        if(str.length==1){
            return 0;
        }
        for(int i=0;i<str.length;++i){
            for(int j=0;j<str.length;++j){
                
                if(i!=j){
                    if(str[i]==str[j]){
                        break;
                    }
                }
                if(j==str.length-1){
                    return i;
                }
                
            }
        }
        return -1;
        
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容