leetcode 389.找不同
题目描述
给定两个字符串 s 和 t,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
示例:
输入:
s = “abcd”
t = “abcde”
输出:
e
解释:
‘e’ 是那个被添加的字母。
解题思路
方法一: 创建两个哈希表,遍历t中的元素是否和s中表中对应元素的数量是否相等,或者s表中如果不存在,那么该元素就是要被添加的元素
class Solution {
public:
char findTheDifference(string s, string t) {
char res = ' ';
unordered_map<char, int> sTable;
unordered_map<char, int> tTable;
// 统计s中的元素
for(int i=0; i<s.size(); i++){
sTable[s[i]] += 1;
}
// 统计t中的元素
for(int i=0; i<t.size(); i++){
tTable[t[i]] += 1;
}
// 由于t比s多一个元素,所以要用t遍历,防止漏掉元素
for(auto tElem : tTable){
if((sTable.find(tElem.first) == sTable.end()) || (sTable[tElem.first] != tElem.second)){
res = tElem.first;
break;
}
}
return res;
}
};
方法二: 异或运算,t是由s随机插入一个字符得到的,所以s和t的元素结合中,肯定有一个元素的数量是奇数,所以通过异或可以筛选出来
class Solution {
public:
char findTheDifference(string s, string t) {
char res = 0;
int len = s.size();
for(int i=0; i<len; i++){
res ^= s[i]^t[i];
}
return res^t[len];
}
};
方法三: 建立一个统计ascii码的数量的数组,遍历s,统计数量,遍历t的时候,对应元素数量减少1,当数量小于零的时候,就是不同的元素。
class Solution {
public:
char findTheDifference(string s, string t) {
char res = ' ';
char ascii[256] = {0};
for (auto i:s){
ascii[i] += 1;
}
for(auto i:t){
ascii[i] -= 1;
if(ascii[i] < 0){
res = i;
}
}
return res;
}
};
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步