1. 程式人生 > 其它 >給定一種規律 pattern 和一個字串 str ,判斷 str 是否遵循相同的規律。

給定一種規律 pattern 和一個字串 str ,判斷 str 是否遵循相同的規律。

給定一種規律 pattern和一個字串str,判斷 str 是否遵循相同的規律。

這裡的遵循指完全匹配,例如,pattern裡的每個字母和字串str中的每個非空單詞之間存在著雙向連線的對應規律。

輸入: pattern = "abba", str = "dog cat cat dog"
輸出: true

輸入:pattern = "abba", str = "dog cat cat fish"
輸出: false

輸入: pattern = "aaaa", str = "dog cat cat dog"

輸出: false

輸入: pattern = "abba", str = "dog dog dog dog"
輸出: false


理解了題意, 思路還是比較好想的.pattern中的每個字元對應str中的每個單詞, 建立一個hash表的對映,

1:判斷字串 pattern 與 s 的長度是否相等,不等則返回 false;
2:接下來遍歷 pattern,用 pattern 的單個字元做為 map 的 key,s 的單個單詞作為 map 的 value;這樣處理了 pattern 到 s 的對映,
3:然後到pattern的下一個字元時, 檢查map中是否有值了,

  • 有值了,判斷是否相等, 相等,繼續下一個字元; 不相等,返回false;
  • 無值,把對應位置上的單詞更新到map中

4:最後例子中還給到了一種情況,pattern = "abba", str = "dog dog dog dog" , a->dog , b->dog, 但是a!=b,還需要檢查下map中的values是否有重複.
5: 上述檢查都成功, 返回true

class Solution {
    func wordPattern(_ pattern: String, _ s: String) -> Bool {

        let array = s.split(separator: " ")
        // 1.檢查元素個數是否相同
        if pattern.count != array.count {
            return false
        }

        var dic = [Character:String]()
        // 2.遍歷取出每個字元
        for (i,oneChar) in pattern.enumerated() {
            // 3.字典中已經有值
            if let value = dic[oneChar] {
                // 3.1 檢查字典中的值和array對應位置的值是否一致
                if value == array[i] {
                    // 3.2 一致,繼續下一輪

                } else {
                    // 3.3 不一致,返回false
                    return false
                }

            } else {
                // 4.字典中無值,更新array值到map中
                dic[oneChar] = String(array[i])
            }
        }

        // 5.檢查字典中的值是否有重複, 用一個set查重
        if dic.values.count != Set.init(dic.values).count {
            return false
        }

        return true

    }
}