1. 程式人生 > >290. Word Pattern

290. Word Pattern

bool 訪問 匹配 span nta 否則 map == 字符

問題描述:

Given a pattern and a string str, find if str follows the same pattern.

Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty word in str.

Example 1:

Input: pattern = "abba", str = "dog cat cat dog"
Output: true

Example 2:

Input:pattern = "abba"
, str = "dog cat cat fish" Output: false

Example 3:

Input: pattern = "aaaa", str = "dog cat cat dog"
Output: false

Example 4:

Input: pattern = "abba", str = "dog dog dog dog"
Output: false

Notes:
You may assume pattern contains only lowercase letters, and str contains lowercase letters separated by a single space.

解題思路:

這道題要求我們求句子是否滿足pattern。

有兩個輸入:pattern 和 str,其中pattern以字符為單位,str以單詞為單位。

若兩個輸入的單位長度不相同,則一定不匹配。

其中不相同有兩種可能:

  1. pattern 長,str短

  2.pattern 短,str長

我決定使用stringstream來讀取str中的單詞。

在讀取是用i來標記單詞的下標同時訪問pattern中的字符。

用兩個map來存儲,這裏認為char和word是一一對應的。

首先檢查i是否超出pattern的長度,然後檢查當前單詞是否有代表的字符出現:

  1.若有,則需要比較是否相同。不相同則返回false

  2.若沒有,則需要查詢當前字母是否代表了其他單詞。若代表其他單詞,則需要返回false

否則將這個字母和單詞的對應加入map

註意在最後的時候檢查i == pattern.size(),若不等於則說明pattern過長

代碼:

class Solution {
public:
    bool wordPattern(string pattern, string str) {
        unordered_map<string, char> m;
        unordered_map<char, string> p;
        
        stringstream ss(str);
        string tmp;
        int i = 0;
        while(getline(ss, tmp,  )){
            if(i >= pattern.size()) return false;
            if(m.count(tmp) != 0){
                if(m[tmp] != pattern[i]) return false;
            }else{
                if(p.count(pattern[i]) != 0) return false;
                m[tmp] = pattern[i];
                p[pattern[i]] = tmp;
            }
            i++;
        }
        if(i < pattern.size()) return false;
        return true;
        
    }
};

290. Word Pattern