1. 程式人生 > >LeetCode演算法題290:單詞模式解析

LeetCode演算法題290:單詞模式解析

給定一種 pattern(模式) 和一個字串 str ,判斷 str 是否遵循相同的模式。

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

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

示例 2:

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

示例 3:

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

示例 4:

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

說明:
你可以假設 pattern 只包含小寫字母, str 包含了由單個空格分隔的小寫字母。

這個題有些複雜,字串操作的題總是有些複雜的,但是思路還是不難,就是用雜湊表儲存鍵值對,然後判斷是不是有不同對映,如果有就是false。當雜湊表中沒有出現pattern字母時,還需要判斷之前的值是否和當前str中的字串有重疊,如果有就是false,如果沒有重疊,那麼就可以把當前的模式和字串加入雜湊表的鍵值中。當出現這個鍵時,如果其值與當前字串不同,那麼就是false。這裡其實還有一個很重要的問題就是當pattern中的元素個數和str中的元素個數不同時一定要返回false,否則會導致一些邊界溢位問題,這個問題在C++中不明顯但是還是會有隱患,在python中會有測試樣例出錯。
C++原始碼:

class Solution {
public:
    bool wordPattern(string pattern, string str) {
        int n = 0;
        for(int i=0;i<str.length();i++)
        {
            if (str[i]==' ') n++;
        }
        if (pattern.length()!=n+1)
            return false;
        map<char, string> m;
        istringstream in
(str); int i=0; for (string word;in>>word;i++) { if (m.count(pattern[i])==0) { for(map<char,string>::iterator it=m.begin();it!=m.end();it++) { if (it->second==word) return false; } m[pattern[i]] = word; } else if (m[pattern[i]]!=word) return false; } return i==pattern.length(); } };

python3原始碼:

class Solution:
    def wordPattern(self, pattern, str):
        """
        :type pattern: str
        :type str: str
        :rtype: bool
        """
        if len(pattern)!=len(str.split()):
            return False
        m = {}
        i = 0
        for word in str.split():
            if pattern[i] not in m:
                for key, value in m.items():
                    if value == word:
                        return False
                m[pattern[i]] = word
            elif m[pattern[i]]!=word:
                return False
            i += 1
        return i==len(pattern)