387. First Unique Character in a String
Analysis
找出第一个字符串中第一个出现且只出现过一次的字符。
Code
直接散列。1
2
3
4
5
6
7
8
9
10
11
12
13class Solution {
public:
int firstUniqChar(string s) {
int times[26] = {0};
for(auto ch: s) {
times[ch - 'a']++;
}
for(int i = 0; i < s.length(); i++) {
if(times[s[i] - 'a'] == 1) return i;
}
return -1;
}
};
383. Ransom Note
Analysis
判断 ransomNote 这个字符串是否能被 magazine 这个字符串中的字符组成。
Code
直接散列,跟上个题差不多的思路。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
if(magazine.length() < ransomNote.length()) return false;
int times[26] = {0};
for(auto ch: magazine) {
times[ch - 'a']++;
}
for(auto ch: ransomNote) {
times[ch - 'a']--;
if(times[ch - 'a'] < 0) return false;
}
return true;
}
};
242. Valid Anagram
Analysis
这个题跟上个题也是类似的...
Code
method 1
1 | class Solution { |
直接比较 vector 的骚操作忘记是从哪里学的了,当然也可以采取与上一题一样的思路,出现负数就返回 false。
还有一个进阶提示:如果输入的是 Unicode 字符怎么办?
要解决这个问题,首先需要知道的是 Unicode 与 Ascii 的不同。当然,不同点很多,但是在这个题目的背景下,只需要注意 Unicode 字符占 2 个字节,而 Ascii 只占 1 个字节。那么,如果还想用哈希的思路来解决这个问题,就需要对哈希表的 key 进行修改。不过,C++ 有现成的 map,所以直接用 map 就行了。
method 2
不过,只是解决这个题的话,其实还有一种做法,那就是排序,只要排序后的 2 个字符串一样,那就是符合条件的。1
2
3
4
5
6
7
8
9class Solution {
public:
bool isAnagram(string s, string t) {
if(s.length() != t.length()) return false;
sort(s.begin(), s.end());
sort(t.begin(), t.end());
return s == t;
}
};
Summary
这 3 个字符串处理的题,都比较简单...