Swift - LeetCode - 找不同

·  阅读 555

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

题目

给定两个字符串 st,它们只包含小写字母。

字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。

请找出在 t 中被添加的字母。

示例 1:

  • 输入: s = "abcd", t = "abcde"
  • 输出: "e"
  • 解释: 'e' 是那个被添加的字母。

示例 2:

  • 输入: s = "", t = "y"
  • 输出: "y"

方法一:计数

思路及解法

首先遍历字符串 ss,对其中的每个字符都将计数值加 1;然后遍历字符串 tt,对其中的每个字符都将计数值减 1。当发现某个字符计数值为负数时,说明该字符在字符串 tt 中出现的次数大于在字符串 ss 中出现的次数,因此该字符为被添加的字符。

代码

class Solution {
    func findTheDifference(_ s: String, _ t: String) -> Character {
        var cnt: [Int] = Array.init(repeating: 0, count: 26)
        let aCh: Character = "a"
        for ch: Character in s {
            cnt[Int(ch.asciiValue! - aCh.asciiValue!)] += 1
        }

        for ch: Character in t {
            cnt[Int(ch.asciiValue! - aCh.asciiValue!)] -= 1
            if cnt[Int(ch.asciiValue! - aCh.asciiValue!)] < 0 {
                return ch
            }
        }
        return Character.init("")
    }
}
复制代码

复杂度分析

  • 时间复杂度:O(N)O(N),其中 NN 为字符串的长度。

  • 空间复杂度:O(Σ)O(|\Sigma|),其中 Σ\Sigma 是字符集,这道题中字符串只包含小写字母,Σ=26|\Sigma|=26。需要使用数组对每个字符计数。

方法二:求和

思路及解法

将字符串 ss 中每个字符的 ASCII 码的值求和,得到 AsA_s;对字符串 tt 同样的方法得到 AtA_t。两者的差值 AtAsA_t-A_s 即代表了被添加的字符。

代码

class Solution {
    func findTheDifference(_ s: String, _ t: String) -> Character {
        var sum: Int = 0
        for ch: Character in s {
            sum -= Int(ch.asciiValue!)
        }

        for ch: Character in t {
            sum += Int(ch.asciiValue!)
        }
        return Character(UnicodeScalar(sum)!)
    }
}
复制代码

复杂度分析

  • 时间复杂度:O(N)O(N)

  • 空间复杂度:O(1)O(1)

方法三:位运算

思路及解法

如果将两个字符串拼接成一个字符串,则问题转换成求字符串中出现奇数次的字符。类似于「只出现一次的数字」,我们使用位运算的技巧解决本题。

代码

class Solution {
    func findTheDifference(_ s: String, _ t: String) -> Character {
        var ret: Int = 0
        for ch: Character in s {
            ret ^= Int(ch.asciiValue!)
        }

        for ch: Character in t {
            ret ^= Int(ch.asciiValue!)
        }
        return Character(UnicodeScalar(ret)!)
    }
}
复制代码

复杂度分析

  • 时间复杂度:O(N)O(N)

  • 空间复杂度:O(1)O(1)

分类:
iOS
收藏成功!
已添加到「」, 点击更改