字符串可以看成是字符组成的数组。由于字符串是程序里经常需要处理的数据类型,因此有很多针对字符串处理的题目,以下是一些常见的类型。

func firstUniqChar(_ s: String) -> Character {
var map = [Character:Int]()
for c in s {
map[c] = (map[c] ?? 0) + 1
}
for c in s {
if map[c] == 1 {
return c
}
}
return Character(" ")
}
为什么还要通过 for 循环遍历一次 s 然后去取第一个 map[c] == 1的 key ? 答:是因为 map 是乱序的,所以需要通过字符串s的顺序来返回第一次出现的字符
下面的代码就是错误的:因为 map 是乱序的
class Solution {
func firstUniqChar(_ s: String) -> Character {
var map = [Character:Int]()
for c in s {
map[c] = (map[c] ?? 0) + 1
}
for d in map {
if d.value == 1 {
return d.key
}
}
return Character(" ")
}
}

我们可以利用哈希表或者数组统计两个字符串数组中每个字符出现的频次,若频次相同,则说明它们包含的字符完全相同
s,然后 map[c] += 1t,然后 map[c] -= 1func isAnagram(_ s: String, _ t: String) -> Bool {
if s.count != t.count { return false }
var map = [Character:Int]()
for c in s {
map[c] = (map[c] ?? 0) + 1
}
for c in t {
map[c] = (map[c] ?? 0) - 1
}
for value in map {
if value.value != 0 {
return false
}
}
return true
}
bool isAnagram(string s, string t) {
if (s.length() != t.length()) {
return false;
}
vector<int> counts(26, 0);
for (int i = 0; i < s.length(); ++i) {
++counts[s[i]-’a’];
--counts[t[i]-’a’];
}
for (int i = 0; i < 26; ++i) {
if (counts[i]) {
return false;
}
}
return true;
}for (int i = 0; i < s.length(); ++i) {
++counts[s[i]-’a’];
--counts[t[i]-’a’];
}上面的这段代码将两次 for 循环写在一起了,减少了一倍的遍历次数。但是 swift 的语言特性的原因,没办法写在一起。大家看下自己熟悉的语言是否可以写成 C++ 的这个解法。
end