【leetcode 389】【找不同】

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}{复杂度分析:}
  1. 排序法
  • 时间复杂度:O(nlogn)
  • 空间复杂度:O(1)
  1. 计数法
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
  1. 位运算法
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
  1. 哈希法
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
  1. 加减法
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值