單詞規律(雙射/LeetCode)
阿新 • • 發佈:2020-12-17
技術標籤:leetcode
題目連結
題目描述
給定一種規律 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 包含了由單個空格分隔的小寫字母。
思路
我們需要判斷字元與字串之間是否恰好一一對應。即任意一個字元都對應著唯一的字串,任意一個字串也只被唯一的一個字元對應。在集合論中,這種關係被稱為「雙射」。
想要解決本題,我們可以利用雜湊表記錄每一個字元對應的字串,以及每一個字串對應的字元。然後我們列舉每一對字元與字串的配對過程,不斷更新雜湊表,如果發生了衝突,則說明給定的輸入不滿足雙射關係。
程式碼如下:
class Solution {
public:
bool wordPattern(string pattern, string s) {
//arr1記錄pattern的字母,arr2記錄單詞
vector<string> arr1,arr2;
string str="";
for(auto i:pattern)
arr1.push_back(str+i);
int last=0;
//找出每個單詞
while( s.find(" ")!=s.npos){
int pos=s.find(" ");
string tmp=s.substr(last,pos-last);
arr2.push_back(tmp);
s=s.substr(pos+1);
}
if(s.length()>0)
arr2.push_back(s);
//利用雙射判斷是否完全匹配
unordered_map<string,string> map1,map2;
for(int i=0;i<arr1.size();i++){
map1[arr1[i]]=arr2[i];
map2[arr2[i]]=arr1[i];
}
if(arr1.size()!=arr2.size())
return false;
for(int i=0;i<arr1.size();i++)
if(map1[arr1[i]]!=arr2[i]||map2[arr2[i]]!=arr1[i])
return false;
return true;
}
};