题目描述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).
解题思路:
这种要统计字符特性的题,第一眼看到应该就想到用map,有键值和属性的一一对应关系,同时检索效率极高。奈何对map的应用不多,导致浪费了很多时间,下次应该就有经验了。这道题的题解很多说是用hash,其实hash也就是把字符和属性一一映射起来,本质上没有什么不同。统计每个字符的出现次数,返回最早出现且只出现一次的字符位置即可,很简单的映射题,
代码如下:
class Solution {
public:
int FirstNotRepeatingChar(string str) {
int len = str.length();
if (len == 0){
return -1;
}
map<char, int> tab1;//记录出现的次数
map<char, int> tab2;//记录出现的位置
for (int i = 0; i < len; i++){
tab1[str[i]]++;
if (tab2[str[i]] == 0){
tab2[str[i]] = i;
}
}
map<char, int>::iterator it;
int ans = 10001;
for(it = tab2.begin(); it != tab2.end(); it++){
if (tab1[(*it).first] == 1 && (*it).second < ans){
ans = (*it).second;
}
}
if (ans == 10001){
return -1;
}
return ans;
}
};
此外,我看题解上有一个很简单的做法,不用统计字符出现的位置,只用再遍历一遍字符串就可以了,这样位置信息已经包含在了字符串中,非常巧妙,非常佩服!!
代码如下:
class Solution {
public:
int FirstNotRepeatingChar(string str) {
int len = str.length();
if (len == 0){
return -1;
}
map<char, int> tab1;//记录出现的次数
for (int i = 0; i < len; i++){
tab1[str[i]]++;
}
for (int i = 0; i < len; i++){
if (tab1[str[i]] == 1){
return i;
}
}
return -1;
}
};
本文介绍了一种使用C++和Map数据结构解决字符串中寻找第一个只出现一次的字符的问题的方法。通过两次遍历,首先统计字符出现的频率,然后再次遍历字符串以找到符合条件的字符,巧妙地简化了解决方案。
509

被折叠的 条评论
为什么被折叠?



