题目描述
给定两个字符串 s
和 t
,它们只包含小写字母。
字符串 t
由字符串 s
随机重排,然后在随机位置添加一个字母。
请找出在 t
中被添加的字母。
https://leetcode.cn/problems/find-the-difference/description/
示例
示例 1:
输入:s = "abcd", t = "abcde"
输出:"e"
解释:'e' 是那个被添加的字母。
示例 2:
输入:s = "", t = "y"
输出:"y"
解题总结
本题可用三个方法来解决
- 方法1
首先遍历字符串 s,对其中的每个字符都将计数值加 1;然后遍历字符串 t,对其中的每个字符都将计数值减 1。当发现某个字符计数值为负数时,说明该字符在字符串 t 中出现的次数大于在字符串 s 中出现的次数,因此该字符为被添加的字符。
此方法也是我解题时所用的方法,与“383.赎金信”一样,都是用哈希表的思想来解决问题
- 方法2
分别对字符串 s 和 t 中每个字符的 ASCII 码的值求和,两者的差值即为被添加的字符
- 方法3
将两个字符串拼接成一个字符串,则问题转换成求字符串中出现奇数次的字符,对这两个字符串中所有的字符逐个异或,最后的结果即为被添加的字符
异或运算的特点是
0 ^ 0 == 0
0 ^ 1 == 1
1 ^ 0 == 1
1 ^ 1 == 0
0 ^ x == x
x ^ x == 0
x ^ y == y ^ x
x ^ y ^ x == y
异或运算满足交换律和结合律,因此在本题中,字符串异或运算的过程大致可抽象为
a ^ c ^ b ^ c ^ d ^ a ^ d == a ^ a ^ c ^ c ^ d ^ d ^ b == 0 ^ 0 ^ 0 ^ b == b
b 即为被添加的字符
代码实现
- 方法1的代码实现
char findTheDifference(char* s, char* t) {
int hash[26] = {0};
int i = 0;
while(s[i] != 0)
{
hash[s[i] - 'a']++;
i++;
}
i = 0;
while(t[i] != 0)
{
hash[t[i] - 'a']--;
i++;
}
char c = 0;
for(i = 0; i < 26; i++)
{
if(hash[i] == -1)
c = i + 'a';
}
return c;
}
- 方法2的代码实现
char findTheDifference(char* s, char* t) {
int sum_s = 0;
int sum_t = 0;
int i = 0;
for(i = 0; i < strlen(s); i++)
sum_s += s[i];
for(i = 0; i < strlen(t); i++)
sum_t += t[i];
return sum_t - sum_s;
}
- 方法3的代码实现
char findTheDifference(char* s, char* t) {
int ret = 0;
int i = 0;
for(i = 0; i < strlen(s); i++)
ret = ret ^ s[i];
for(i = 0; i < strlen(t); i++)
ret = ret ^ t[i];
return ret;
}
标签:字符,++,不同,sum,char,int,字符串,389,LeetCode
From: https://www.cnblogs.com/changbaiqiusha/p/18052429