1. 程式人生 > 其它 >單詞規律(雙射/LeetCode)

單詞規律(雙射/LeetCode)

技術標籤: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; } };