leetcode 389 找不同
给定两个字符串 s 和 t,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。请找出在 t 中被添加的字母。
示例:
输入:s = “”, t = “y”
输出:“y”
输入:s = “a”, t = “aa”
输出:“a”
输入:s = “ae”, t = “aea”
输出:“a”
解题思路:
排序法
对两个字符串排序,然后根据 t t t的长度遍历,判断 s s s和 t t t的对应位置是否相等,如果是就直接返回。直到遍历到s的最后一个位置,如果还有元素,则直接返回该元素
计数法
遍历字符串t,判断每个字母在字符串中的计数,如果s和t对于这个字母的计数不相等,说明该字母有不同,直接返回该值
位运算法
一个数与零做XOR运算等于自身,一个数与其本身做XOR等于零,所以如果我们把所有字符的ascii码做XOR运算,最后就会得到不同值的ascii码.
a⊕b⊕a = (a⊕a)⊕b = 0⊕b = b
哈希法
26个字母对应0~25的index,因为题目中只有26个小字母,先遍历s,把计数存储到列表中,然后遍历t,遇到相同的key就删除一个计数,最后总有一个值是不等于0的,把这个值的index拿出来,’a‘+index就是结果的ascii码
加减法
先把t的所有元素都ascii码加起来,然后减去所有s的元素的ascii码,剩下的数字就是答案了
代码思路:
排序法
字符串可以使用sorted()进行排序
计数法
s.count(i)就是对 某个字母 在 字符串s的计数
位运算法
ord是转换为ascii码,因为t比s多一个字母,所以直接从最后一个元素取出来进行XOR运算,chr是把码转换为字母
代码:
排序法
s = sorted(s)
t = sorted(t)
for i in range(len(t)):
if i >= len(s):
return t[i]
if s[i] != t[i]:
return t[i]
计数法
for i in t:
if s.count(i) != t.count(i):
return i
位运算法
res = ord(t[-1])
for i in range(len(s)):
res ^= ord(s[i])
res ^= ord(t[i])
return chr(res)
哈希法
class Solution:
def findTheDifference(self, s: str, t: str) -> str:
if len(s) == 0:
return t
table = [0]*26
for i in range(len(t)):
if i < len(s):
table[ord(s[i])-ord('a')] += 1
table[ord(t[i])-ord('a')] -=1
for i in range(26):
if table[i] != 0:
return chr(i+97)
加减法
class Solution:
def findTheDifference(self, s: str, t: str) -> str:
if len(s) == 0:
return t
total = 0
for i in range(len(t)):
if i< len(s):
total -= ord(s[i])
total += ord(t[i])
return chr(total)
复 杂 度 分 析 : \color{red}{复杂度分析:} 复杂度分析:
- 排序法
- 时间复杂度:O(nlogn)
- 空间复杂度:O(1)
- 计数法
- 时间复杂度:O(n)
- 空间复杂度:O(1)
- 位运算法
- 时间复杂度:O(n)
- 空间复杂度:O(1)
- 哈希法
- 时间复杂度:O(n)
- 空间复杂度:O(1)
- 加减法
- 时间复杂度:O(n)
- 空间复杂度:O(1)