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;
}
};

本文详细解析了LeetCode上第290题“Word Pattern”的解题思路,通过使用map和set的数据结构,实现了一种高效的一一对应匹配算法,确保pattern与字符串str中单词的全匹配。
799

被折叠的 条评论
为什么被折叠?



