给出一个字符串。找到字符串中第一个不重复的字符然后返回它的下标。如果不存在这样的字符,返回 -1。
样例
给出字符串 s = "lintcode",返回 0。
给出字符串 s = "lovelintcode",返回 2。
1.最容易想到的一个思路,双层遍历,对于每一个字符,遍历整个字符串,如果能找到相同的(且不能是当前字符串),则不合要求,直接跳出内层循环检查下一个,只要找到第一个单独的,没有重复的,则可以返回索引,要注意一种情况是不存在这样的字符怎么呢,那就是遍历了所有的字符都没有找到这样一个字符,我们同样返回-1.
int firstUniqChar(string &s) {
if(s.empty())
return -1;
int num=0;
for(size_t i=0;i<s.size();i++) //对每个字符都遍历所有字符
{
for(size_t j=0;j<s.size();j++)
{
if(s[j]==s[i]&&i!=j)
//如果有相等的,而且不是本字符,那么说明有相同的,考察下一个字符
{ num++;
break;
}
if(j==s.size()-1) //遍历到最后一个也没有找到,那说明这个就是符合要求的,返回
{return i;
}
}
}
if(num=s.size()) //如果字母都找过了也没有,则返回-1
return -1;
// write your code here
}
2.另一种思路一开始想的是可以把每个字符放在一个哈希表中,但这个要求hash_map是按照插入顺序的,但是c++STL中给出的无序版本的map也并非是按照插入的顺序来的,所以这种方法用hash_map是不好做了,当然我可以用vector<pair<char,int>>来做,find函数,正好可以返回vector的迭代器。这种的复杂度并不比上面想的那个要小,所以也不写了。
网友评论