贖金信, 字串A能否完全被字串B包含
阿新 • • 發佈:2021-01-11
技術標籤:資料結構和演算法
給定一個ransom字串和一個magazine字串,判斷第一個字串 ransom 能不能由第二個字串 magazines 裡面的字元構成。如果可以構成,返回 true ;否則返回 false。
你可以假設兩個字串均只含有小寫字母。
canConstruct("a", "b") -> false
canConstruct("aa", "ab") -> false
canConstruct("aa", "aab") -> true
思路還是比較簡單的, 第二個字串做成一個hash表, 統計每個字元的出現次數, 然後在遍歷ransom字串, 每遇到一個字元就把count減1, 如果減到負數, 說明不能滿足條件, 返回false即可, 如果遍歷完了ransom 還沒有返回, 那就說明滿足條件, 返回true即可. 時間複雜度是O(M+N), 取決於2個字元的長度, 執行時長在140ms左右
class Solution { func canConstruct(_ ransomNote: String, _ magazine: String) -> Bool { var dic = [Character:Int]() for (_,item) in magazine.enumerated() { dic[item, default: 0] += 1 } for (_,item) in ransomNote.enumerated() { let value = dic[item] if value == nil { return false } if value!-1 < 0 { return false } dic[item] = value!-1 } return true } }
看了題解 , 還有一種解法, 思路大致一致, 但是就是執行效果高了很多, 在40ms左右,
class Solution { func canConstruct(_ ransomNote: String, _ magazine: String) -> Bool { var tmp = magazine for c in ransomNote { guard let index = tmp.firstIndex(of: c) else { return false } tmp.remove(at: index) } return true } }