题目链接:
https://leetcode-cn.com/problems/find-the-difference
给定两个字符串 s 和 t,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
示例 1:
代码语言:javascript复制输入:s = "abcd", t = "abcde"
输出:"e"
解释:'e' 是那个被添加的字母。
示例 2:
代码语言:javascript复制输入:s = "", t = "y"
输出:"y"
示例 3:
代码语言:javascript复制输入:s = "a", t = "aa"
输出:"a"
示例 4:
代码语言:javascript复制输入:s = "ae", t = "aea"
输出:"a"
提示:
代码语言:javascript复制0 <= s.length <= 1000
t.length == s.length 1
s 和 t 只包含小写字母
思路:
计数、位运算、求和
1.计数
可以先用数组统计 s 的字符出现的次数。然后开始遍历字符串 t,数组中对应字符的次数减 1。当数组中出现负数,那么代表对应的字符就是添加的字母。
代码语言:javascript复制class Solution:
def findTheDifference(self, s: str, t: str) -> str:
# 长度为 26 的数组,用以统计字符出现次数
str_count= [0] * 26
for ch in s:
str_count[ord(ch)-ord('a')] = 1
for ch in t:
str_count[ord(ch)-ord('a')] -= 1
if str_count[ord(ch) - ord('a')] < 0:
return ch
return ""
2.位运算
将两个字符串拼接起来,那么就可以转化为求字符串中出现次数为奇数的字符。可以用位运算来解决这个问题。
这里再提下异或的性质:二进制位同一位相同则为 0,不同则为 1。关于异或的规律:
任何数与自身异或结果为 0。
任何数与 0 异或结果为本身。
同时,异或满足交换律、结合律(数学符号:⊕)
交换律:a ⊕ b = b ⊕ a
结合律:a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c
这里使用位运算异或具体的思路如下:
代码语言:javascript复制class Solution:
def findTheDifference(self, s: str, t: str) -> str:
new_s = s t
ans = 0
for ch in new_s:
ans ^= ord(ch)
return chr(ans)
3.求和
这里借鉴 官方题解 给出的思想。先分别计算字符串 s 和字符串 t 各个字符对应的 ASCII 码值之和。因为 t比 s 只多了一个字母,那么用 t中各个字符的 ASCII 值和减去 s 各个字符的 ASCII 值和,最终差值转换为 ASCII 字符即是所求结果
代码语言:javascript复制class Solution:
def findTheDifference(self, s: str, t: str) -> str:
add_s = 0
add_t = 0
for ch in s:
add_s = ord(ch)
for ch in t:
add_t = ord(ch)
return chr(add_t-add_s)