题目描述
在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置
思路: 用一个map/unordered_map存或者用一个一维数组 字符和出现次数 然后遍历字符串都存入
再次遍历字符串顺序,从表中找到second值为1的 返回其在数组中的位置(0~len-1)。
时间复杂度分析:
用map 插删查 logN
用unordered_map 插查O(1) 空间O(K)
用一维数组 按下标访问O(1) 空间O(K)
法1:用unordered_map
思路: 用一个map/unordered_map存或者用一个一维数组 字符和出现次数 然后遍历字符串都存入
再次遍历字符串顺序,从表中找到second值为1的 返回其在数组中的位置(0~len-1)。
时间复杂度分析:
用map 插删查 logN
用unordered_map 插查O(1) 空间O(K)
用一维数组 按下标访问O(1) 空间O(K)
法1:用unordered_map
class Solution { public: int FirstNotRepeatingChar(string str) { if(str.empty()) return -1; unordered_map<char,int> umap; for(int i=0;i<str.size();i++){ umap[str[i]]++; } for(int i=0;i<str.size();i++){ if(umap[str[i]]==1) return i; } return -1; } };
法2:
class Solution { public: int FirstNotRepeatingChar(string str) { if(str.empty()) return -1; int * alpha = new int[256]; memset(alpha,0,sizeof(alpha)); for(int i=0;i<str.size();i++){ int pos = (int)str[i]; alpha[pos]++; } for(int i=0;i<str.size();i++){ int pos = (int)str[i]; if(alpha[pos]==1) return i; } return -1; } };