290. Word Pattern
问题描述:
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; } };