题解 | #第一个只出现一次的字符#

第一个只出现一次的字符

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;
    }
};
全部评论

相关推荐

点赞 评论 收藏
分享
过往烟沉:我说什么来着,java就业面就是广!
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务