1. 程式人生 > 其它 >贖金信, 字串A能否完全被字串B包含

贖金信, 字串A能否完全被字串B包含

技術標籤:資料結構和演算法

給定一個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
    }
}