给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -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;
}
}