题目描述
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
示例:
s = “abaccdeff”
返回 “b”
s = “”
返回 " "
class Solution {
public:
char firstUniqChar(string s) {
//if(s == "") return ' ';
/*
int i = 0;
unordered_map <char,int> Charmap;
while(s[i])
{
Charmap[s[i]]++;
i++;
}
i = 0;
while(s[i])
{
if(Charmap[s[i]] == 1) return s[i];
i++;
}
return ' ';
*/
//vector<int> hash(128,0); //定义一个长度为128的Int类型数组,初始化值为0
int hash[128] = {0};
for(char c:s) hash[c]++; //若确定字符均为字母,可定义26大小的数组空间,ch-'a'为键值
for(char c:s) if(hash[c] == 1) return c;
return ' ';
}
};
//为什么用数组会快得多?int hash与vector hash与unorderedmap与map的速度比较
//用vector定义和int arr[128] = 0{}和int [] arr = new int[128]定义哪个好?
//优化思路1:Java中提供了LinkedHashMap,能使得遍历的顺序和插入数据的顺序保持一致,使用该hashmap可使长字符串多重复字符的情况下,第二遍遍历时间大大缩减,C++没有这种map。
//优化思路2:ASCII字符最大十进制数值为126,使用固定长度128的数组当hash表,可以缩减空间复杂度。
//优化思路3:unordered_map比map查找更快。
//优化思路4:使用count方法判断键值对是否存在,存在(出现过的字符)则将其值置为0,不存在将其置为1。用bool值判断出现次数更节省空间。
//unordered_map与map的区别
//遍历字符串的新写法for(char c:s);
//常量空间,空间复杂度为O(1),即使是引入了新的空间也是O(1)。所以自定义128大小数组存储键值对可以缩减空间复杂度。
//c++定义数组的写法?
//vector定义数组的写法和好处?