题解 | #第一个只出现一次的字符#
第一个只出现一次的字符
http://www.nowcoder.com/practice/1c82e8cf713b4bbeb2a5b31cf5b0417c
使用一个二维数组来记录遍历过的字符的出现次数以及出现顺序。
将大写小写字母分开存储,这么做是为了便于处理。
在遍历一次字符串,得到了记录有信息的而为数组后,遍历两个二维数组,分别得出最先出现的小写字母以及最先出现的大写字母。
找到这两个字母在字符串中首次出现的位置,返回这两个位置中的小值。
这么做时间复杂度为O(n),空间复杂度为O(n)。
class Solution {
public:
int FirstNotRepeatingChar(string str) {
if(str.empty()){
return -1;
}
vector<int> temple = {0, -1};
vector<vector<int>> logS(26,temple);
vector<vector<int>> logB(26,temple);
int number = 0;
for(int i = 0;i < str.size();i++){
if(str[i] >= 'a' && str[i] <= 'z'){
logS.at(str[i] - 'a').at(0)++;
if(logS.at(str[i] - 'a').at(1) == -1){
logS.at(str[i] - 'a').at(1) = number++;
}
}
else{
logB.at(str[i] - 'A').at(0)++;
if(logB.at(str[i] - 'A').at(1) == -1){
logB.at(str[i] - 'A').at(1) = number++;
}
}
}
int min = 10001;
char target = '0';
for(int i = 0;i < logS.size();i++){
if(logS.at(i).at(0) == 1 && logS.at(i).at(1) < min){
target = i + 'a';
min = logS.at(i).at(1);
}
}
for(int i = 0;i < logB.size();i++){
if(logB.at(i).at(0) == 1 && logB.at(i).at(1) < min){
target = i + 'A';
min = logB.at(i).at(1);
}
}
if(target == '0'){
return -1;
}
else{
for(int i = 0;i < str.size();i++){
if(str[i] == target){
return i;
}
}
}
return -1;
}
};