题面

原题链接

代码

本题有很多做法

动静布局(本人想进去的,工夫性能要比哈希表优良很多):

int变量dpIndex,记录整个字符串中第一次只呈现一次的字符下标

int数组present[123],因为'z'的ascii码是122,初始化为全0

dp[i] = 前i个字符串中第一个只呈现一次的字符

动静布局过程

if s[i]!=dp[i-1]    dp[i] = dp[i-1] else    present[s[dpIndex]] = 1    dpIndex++ until present[s[dpIndex]] != 1        dp[dpIndex] = s[dpIndex]        j = dpIndex

源代码

class Solution {public:    char firstUniqChar(string s) {        char result = 'n';        int present[123];        for(int i=0; i<123;i++){            present[i] = 0;        }        int len = s.size();        if(len==0){            return ' ';        }        char dp[len];        for(char k:dp){            k=' ';        }        int dpIndex = 0;        dp[0] = s[0];        int j= 1;        for(j = 1;j<len;j++){            if(s[j] != dp[j-1]){                dp[j] = dp[j-1];            }             else{                present[s[j]] = 1;                while(dpIndex<len && present[s[dpIndex]] == 1){                     dpIndex++;                }                if(dpIndex>=len){                    return ' ';                }                dp[dpIndex] = s[dpIndex];                j = dpIndex;                // if(j==len-1){                //     return ' ';                // }                cout<<dpIndex<<endl;            }        }        return dp[len-1];    }};

哈希表(书上给的做法,能够通过所有测试用例)

class Solution {public:    char firstUniqChar(string s) {        if(s.size()==0){            return ' ';        }        map<char,int> sta;        for(char k:s){            if(sta.find(k) == sta.end()){                sta[k] = 1;            }            else{                sta[k]++;            }        }        for(char k:s){            if(sta[k]==1){                return k;            }        }        return ' ';    }};