题目
解法
在这道题中,模式(pat)与单词(word)必须是1-1对应的关系,因此可使用两个哈希表来存储映射关系,若双方不匹配便返回false;如果pat
的个数与word
的个数不相等,也返回flase。
class Solution {
public:
bool wordPattern(string pattern, string s) {
unordered_map<char, string> ch_str_map;
unordered_map<string, char> str_ch_map;
int j = 0;
bool isOver = false;
for (int i = 0; i < pattern.size(); i++) {
auto pat_it = ch_str_map.find(pattern[i]);
string word = readNextWord(s, j, isOver);
if (isOver) { // word已经提取完成
if (i+1 < pattern.size()) { // 模式多余
return false;
}
}
if (pat_it == ch_str_map.end()) { // 该模式还未加入map中
if (str_ch_map.find(word) == str_ch_map.end()){ // 该word没有加入map中
if (word != ""){ // 返回的为非空串
ch_str_map.insert(pair<char, string>(pattern[i], word));
str_ch_map.insert(pair<string, char>(word, pattern[i]));
}
} else { // 两个模式映射为同一个word,不可取
return false;
}
} else { // 若该模式已加入map
if (pat_it->second != word) { // 模式不匹配
return false;
}
}
}
if (j < s.size()) {
return false;
}
return true;
}
string (string &s, int &j, bool &isOver) {
string word = "";
while (j < s.size() && s[j] != ' ') {
word += s[j++];
}
if (j >= s.size()) {
isOver = true;
}
++j;
return word;
}
};
提交结果
总结
今天的题目比较简单,思路也很快就出来了,但是在一些小细节的地方总抓不住,老是忽略某些可能特殊输入,程序鲁棒性不够;另一个问题是对STL的使用不熟练以及代码习惯等原因,同样的功能,我的代码远比Leetecode官方的代码冗长。此二点值得注意。