持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
题目
给定两个字符串 s 和 t,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
示例 1:
- 输入:
s = "abcd", t = "abcde"- 输出:
"e"- 解释: 'e' 是那个被添加的字母。
示例 2:
- 输入:
s = "", t = "y"- 输出:
"y"
方法一:计数
思路及解法
首先遍历字符串 ,对其中的每个字符都将计数值加 1;然后遍历字符串 ,对其中的每个字符都将计数值减 1。当发现某个字符计数值为负数时,说明该字符在字符串 中出现的次数大于在字符串 中出现的次数,因此该字符为被添加的字符。
代码
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("")
}
}
复杂度分析
-
时间复杂度:,其中 为字符串的长度。
-
空间复杂度:,其中 是字符集,这道题中字符串只包含小写字母,。需要使用数组对每个字符计数。
方法二:求和
思路及解法
将字符串 中每个字符的 ASCII 码的值求和,得到 ;对字符串 同样的方法得到 。两者的差值 即代表了被添加的字符。
代码
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)!)
}
}
复杂度分析
-
时间复杂度:。
-
空间复杂度:。
方法三:位运算
思路及解法
如果将两个字符串拼接成一个字符串,则问题转换成求字符串中出现奇数次的字符。类似于「只出现一次的数字」,我们使用位运算的技巧解决本题。
代码
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)!)
}
}
复杂度分析
-
时间复杂度:。
-
空间复杂度:。