LeetCode演算法題290:單詞模式解析
阿新 • • 發佈:2018-11-20
給定一種 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)