/**
Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if the ransom note can be constructed from the magazines ; otherwise, it will return false.
Each letter in the magazine string can only be used once in your ransom note.
Note:
You may assume that both strings contain only lowercase letters.
canConstruct("a", "b") -> false
canConstruct("aa", "ab") -> false
canConstruct("aa", "aab") -> true
*/
/**
Thinking:
Ransom <-> Magazine 以下简称为 R M
这个题目的意思是 R 可以由 M 构造,而且都是小写字母,这样 M 和 R 里面出现
的同一个字母 M 的次数要比 R 多才满足。
于是这个问题就转换了堆排序的基础,给定 26 个小写字母的堆,然后统计 M 里面
字母出现的次数,然后 R 去匹配,一旦 M 中的某一个堆的数目小于 R 中的,则不
满足了。
*/
func canConstruct(_ ransom: String, from magazine: String) -> Bool {
guard ransom.lengthOfBytes(using: .ascii) > 0,
magazine.lengthOfBytes(using: .ascii) > 0
else {
return false
}
var lowerCaseArray:[Int] = [Int].init(repeating: 0, count: 26)
//注意Swift中的value的获取
let aValue = ("a" as UnicodeScalar).value
for ch in magazine.unicodeScalars {
lowerCaseArray[Int(ch.value - aValue)] += 1
}
for ch in ransom.unicodeScalars {
let chValue = Int(ch.value - aValue)
lowerCaseArray[chValue] -= 1
//小于零则是无法由当前数目构造
if (lowerCaseArray[chValue] < 0) {
return false
}
}
return true
}
canConstruct("ab", from: "abc")
canConstruct("", from: "c")
canConstruct("aa", from: "aba")
canConstruct("abc", from: "ab")
383. Ransom Note
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- Given an arbitrary ransom note string and another string ...
- 题目 Given an arbitrary ransom note string and another stri...
- Q: Given an arbitrary ransom note string and another stri...