题解 | #第一个只出现一次的字符#
第一个只出现一次的字符
http://www.nowcoder.com/practice/1c82e8cf713b4bbeb2a5b31cf5b0417c
审题很重要
str中大小写字母都有,区分开来
因此:
- 不能只考虑示例中的小写字母
- 将大小写字母区分统计
返回:第一个出现的字符的下标
因此,凡是设计排序的方法都不可行:
- 不能用集合方法来解决
sort()、unique()
的思路都不可取- 遍历要遍历原字符串,不能遍历哈希数组,不然没法得到下标
算法
- 把字符当哈希
key
,字符出现次数当哈希value
- 遍历字符串,构造哈希数组
- 遍历字符串,判断哈希数组中的值是否为1,进而判断该字符是否第一次出现
#include<algorithm>
class Solution {
public:
int FirstNotRepeatingChar(string str) {
//写个集合;
//现将字符排一下序
// sort(str.begin(),str.end());
// str.erase(unique(str.begin(),str.end()),str.end());
if(str.empty()) return -1;
vector<int> a(128,0);
for(int j=0;j<str.length();j++) a[str[j]]++;
// if(65<=str[j]&str[j]<=90) a[str[j]-'A']++; //大写字母从0到25
// else a[str[j]-71]++; //小写字母从26到51
for(int j=0;j<str.length();j++){
if(a[str[j]]==1) return j;
}
return -1;
// for(int k=0;k<52;k++){
// if(a[k]>1) return
// }
//这样处理后的字符串无重复字符
}
};