title: Leetcode 389.找不同
hidden: true
tags:
给定两个字符串 s 和 t,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
示例:
输入:
s = "abcd"
t = "abcde"
输出:
e
解释:
'e' 是那个被添加的字母。
不用位运算的做法是遍历字符串t, 将t中每一个字符的出现次数存入哈希表, 而后遍历字符串s, 减去每个字符出现次数, 找到那个出现次数为1的字符.
使用位运算做法则是初始化结果res为0, 对s和t的每一位与res取异或, 最后res的值便是多出来的字符.
class Solution { // 不用位运算
public:
unordered_map<char, int> m;
string::iterator it;
char findTheDifference(string s, string t) {
for(char c='a'; c<='z'; ++c) { // 初始化哈希表m
m[c] = 0;
}
it = t.begin();
while(it != t.end()) {
m[*it] = m[*it]+1;
it++;
}
it = s.begin();
while(it != s.end()) {
m[*it] = m[*it]-1;
it++;
}
for(char c='a'; c<='z'; ++c) {
if(m[c] != 0) return c;
}
return 0;
}
};
class Solution { // 使用位运算
public:
char findTheDifference(string s, string t) {
char c = 0; // 初始化结果res为0
s.push_back(0); // 统一s和t的字符数
for(int i=0; i<t.size(); ++i) {
c ^= s[i]; // 对res和s[i]取异或
c ^= t[i]; // 对res和t[i]取异或
}
return c;
}
};