leetcode 389.找不同
题干
给定两个字符串 s 和 t,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
示例 1:
输入:s = “abcd”, t = “abcde”
输出:“e”
解释:‘e’ 是那个被添加的字母。
示例 2:
输入:s = “”, t = “y”
输出:“y”
示例 3:
输入:s = “a”, t = “aa”
输出:“a”
示例 4:
输入:s = “ae”, t = “aea”
输出:“a”
提示:
0 <= s.length <= 1000
t.length == s.length + 1
s 和 t 只包含小写字母
题解
既然t是s的随机排序,那就干脆把两个全部重排,然后遍历短的,查找第一个下标对应不同字母的出现位置,如果遍历过程中没有出现,说明插入的字母在最后一位。
class Solution {
public:
char findTheDifference(string s, string t) {
sort(s.begin(),s.end());
sort(t.begin(),t.end());
for(int i = 0 ; i < s.length() ; ++i){
if(t[i] != s[i]){
return t[i];
}
}
return t[t.length()-1];
}
};
不想排序还可以用经典数组储存,统计两个字符串中字母出现的个数,s出现++t出现–,若最后不为0则说明这个字母就是多出来的字母
class Solution {
public:
char findTheDifference(string s, string t) {
vector<int> count(26,0);
for(int i = 0 ; i < s.length() ; ++i){
count[s[i] - 'a']++;
count[t[i] - 'a']--;
}
count[t[t.length() - 1] - 'a']--;
for(int i = 0 ; i < 26 ; ++i){
if(count[i] != 0){
char alpha = 'a' + i;
return alpha;
}
}
return NULL;
}
};
或者不想用数组,直接一点就用unordered_map(会慢一点)
class Solution {
public:
char findTheDifference(string s, string t) {
unordered_map<char,int> count;
for(int i = 0 ; i < s.length() ; ++i){
count[s[i]]++;
count[t[i]]--;
}
count[t[t.length() - 1]]--;
for(int i = 0 ; i < 26 ; ++i){
char temp = 'a' + i;
if(count[temp] != 0){
return temp;
}
}
return NULL;
}
};
位运算属实妙极:遍历两个字符串,在t中新加的字母总的出现次数一定是奇数次,而其他字母一定是偶数次,所以只要取0对全部字符的ascii码不断异或,最后结果一定是新加字母的ascii码
0和任意二进制数按位异或得到的结果都是其原样,而任意二进制数和自身按位异或得到的结果都是0,即0和任意数a异或n次,n为奇数时结果为a,n为偶数时结果为0
class Solution {
public:
char findTheDifference(string s, string t) {
int ret = 0;
for (char ch: s) {
ret ^= ch;
}
for (char ch: t) {
ret ^= ch;
}
return ret;
}
};