leetCode290:單詞規律
阿新 • • 發佈:2020-12-17
技術標籤:刷題筆記
目錄
一、題目描述
給定一種規律 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包含了由單個空格分隔的小寫字母。
二、解題思路
這道題考察雜湊,但是考察的是對映裡的雙射。之前沒有做過這類題,自己瞎寫搞了好久…
雙射:兩個集合裡的值一一對映。比如題目裡的ch與string單詞的對映,string單詞與ch的對映就是雙射關係。
雖然是簡單題,雙射還是要記錄一下的。
三、程式碼實現
#include <bits/stdc++.h> using namespace std; bool wordPattern(string pattern, string s) { int length = s.size(); vector<string> words; string tmp = ""; for (int i = 0; i < length; ++i) { if (s[i] != ' ') { tmp += s[i]; } if (s[i] == ' ' || i == length - 1) { words.push_back(tmp); tmp = ""; } } if (pattern.size() != words.size()) return false; //學習雙射這個概念 unordered_map<char, string> ch2str; unordered_map<string, char> str2ch; for (int i = 0; i < pattern.size(); i++) { char ch = pattern[i]; if (ch2str.count(ch) && ch2str[ch] != words[i]) return false; if (str2ch.count(words[i]) && str2ch[words[i]] != ch) return false; ch2str[ch] = words[i]; str2ch[words[i]] = ch; } return true; } int main() { string pattern = "abc"; string s = "dog cat dog"; cout << wordPattern(pattern, s) << " "; return 0; }