【剑指Offer-时间效率与空间效率的平衡】面试题50:第一个只出现一次的字符
题目描述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).
思路1
遍历字符串,判断当前字符是否在当前字符之后出现过,也就是需要两个循环,时间复杂度为O(n^2)。
思路2
使用哈希表,并遍历两遍字符串。第一次遍历字符串时,记录每个字符出现的次数,由于字符范围为0~255,所以可以把一个长度为256的数组作为哈希表。第二次遍历字符串时,根据哈希表判断该字符出现的次数是否为1,是的话返回即可。代码如下:
class Solution {
public:
int FirstNotRepeatingChar(string str) {
if(str.length()==0)
return -1;
int dict[256];
memset(dict, 0, sizeof(dict));
for(int i=0; i<str.length(); i++)
dict[str[i]]++;
for(int i=0; i<str.length(); i++){
if(dict[str[i]]==1)
return i;
}
return -1;
}
};
该算法遍历了两次字符串,时间复杂度为O(n)。