leetcode每日一题:389. 找不同

2020-12-30 11:36:55 浏览数 (1)

题目链接:

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)

0 人点赞