389. Find the Difference (Medium)
Given two strings s and t which consist of only lowercase letters.
String t is generated by random shuffling string s and then add one more letter at a random position.
Find the letter that was added in t.
Example:
Input:
s = "abcd"
t = "abcde"
Output:
e
Explanation:
'e' is the letter that was added.
Solution 1: Hash Table 13ms
这道题给了我们两个字符串s和t,t是在s的任意一个地方加上了一个字符,让我们找出新加上的那个字符。这道题确实不是一道难题,首先第一反应的方法就是用哈希表来建立字符和个数之间的映射,如果在遍历t的时候某个映射值小于0了,那么返回该字符即可,参见代码如下:
class Solution {
public:
char findTheDifference(string s, string t) {
unordered_map<char, int> m;
for (auto c: s) ++m[c];
for (auto c: t) {
if (--m[c] < 0) return c;
}
return 0;
}
};
Solution 2: Bit Manipulation 6ms
我们也可以使用位操作Bit Manipulation来做,利用异或的性质,相同位返回0,这样相同的字符都抵消了,剩下的就是后加的那个字符,参见代码如下:
class Solution {
public:
char findTheDifference(string s, string t) {
char res = 0;
for (auto c: s) res ^= c;
for (auto c: t) res ^= c;
return res;
}
};
Solution 3: Bit Manipulation 6ms
我们也可以直接用加和减,相同的字符一减一加也抵消了,剩下的就是后加的那个字符,参见代码如下:
class Solution {
public:
char findTheDifference(string s, string t) {
char res = 0;
for (auto c: s) res -= c;
for (auto c: t) res += c;
return res;
}
};
Solution 4:
下面这种方法是史蒂芬大神提出来的,利用了STL的accumulate函数,实际上是上面解法二的改写,一行就写完了真是丧心病狂啊,参见代码如下:
char findTheDifference(string s, string t) {
return accumulate(begin(s), end(s += t), 0, bit_xor<int>());
}