我正在参加「掘金·启航计划」
题目
给你两个字符串:ransomNote 和 magazine,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true;否则返回 false。
magazine 中的每个字符只能在 ransomNote 中使用一次。
示例 1:
- 输入:
ransomNote = "a", magazine = "b"- 输出:
false
示例 2:
- 输入:
ransomNote = "aa", magazine = "ab"- 输出:
false
示例 3:
- 输入:
ransomNote = "aa", magazine = "aab"- 输出:
true
方法一:字符统计
思路及解法
题目要求使用字符串 中的字符来构建新的字符串 ,且 中的每个字符只能使用一次,只需要满足字符串 中的每个英文字母 的统计次数都大于等于 中相同字母的统计次数即可。
-
如果字符串 的长度小于字符串 的长度,则我们可以肯定 无法构成 ,此时直接返回 。
-
首先统计 中每个英文字母 的次数 ,再遍历统计 中每个英文字母的次数,如果发现 中存在某个英文字母 的统计次数大于 中该字母统计次数 ,则此时我们直接返回 。
代码
class Solution {
func canConstruct(_ ransomNote: String, _ magazine: String) -> Bool {
if ransomNote.count > magazine.count {
return false
}
var cnt: [Int] = Array.init(repeating: 0, count: 26)
let zCh: Character = "a"
for ch: Character in magazine {
cnt[Int(ch.asciiValue! - zCh.asciiValue!)] += 1
}
for ch: Character in ransomNote {
cnt[Int(ch.asciiValue! - zCh.asciiValue!)] -= 1
if cnt[Int(ch.asciiValue! - zCh.asciiValue!)] < 0 {
return false
}
}
return true
}
}
复杂度分析
-
时间复杂度:,其中 是字符串 的长度, 是字符串 的长度,我们只需要遍历两个字符一次即可。
-
空间复杂度:, 是字符集,这道题中 为全部小写英语字母,因此 。