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 that may be separated by a single space.
题目链接:https://leetcode.com/problems/word-pattern/
解法:map
注意:特殊例子
"abba"
"dog dog dog dog"
结果是:false
因此可以看出pattern和句子是一一对应关系,这里对map中的value遍历。
class Solution {
public:
bool wordPattern(string pattern, string str) {
unordered_map<char,string> record;
vector<string> strs = split(str, ' ');
if(pattern.length()!=strs.size()) return false;
for(int i=0; i<strs.size();++i){
if(record.find(pattern[i]) == record.end()) {
if(hasValue(record, strs[i])) return false;
record[pattern[i]] = strs[i];
}
else if(record[pattern[i]] != strs[i]) return false;
}
return true;
}
vector<string> split(string s,char token){
istringstream iss(s);
string word;
vector<string> vs;
while(getline(iss,word,token)){
vs.push_back(word);
}
return vs;
}
bool hasValue(unordered_map<char,string> record, string value){
for(unordered_map<char,string>::iterator i=record.begin();i!=record.end();++i){
if(i->second==value) return true;
}
return false;
}
};
改进:使用set来判断一一对应关系
降低时间复杂度
class Solution {
public:
bool wordPattern(string pattern, string str) {
unordered_map<char,string> record;
vector<string> strs = split(str, ' ');
if(pattern.length()!=strs.size()) return false;
unordered_set<string> values;
for(int i=0; i<strs.size();++i){
if(record.find(pattern[i]) == record.end()) {
if(values.find(strs[i])!=values.end()) return false;
record[pattern[i]] = strs[i];
values.insert(strs[i]);
}
else if(record[pattern[i]] != strs[i]) return false;
}
return true;
}
vector<string> split(string s,char token){
istringstream iss(s);
string word;
vector<string> vs;
while(getline(iss,word,token)){
vs.push_back(word);
}
return vs;
}
};