Come from : [https://leetcode-cn.com/problems/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
Note:
You may assume pattern contains only lowercase letters, and str contains lowercase letters that may be separated by a single space.
easy 类型题目(我感觉并不easy~)。用 字符哈希表。
下面是思路,我的代码里 也有详细的 注释,分享给大家。
分析例子,总结规律:
算法思路:str=“dog cat cat *” pattern=“abb?”
AC代码如下:
class Solution {
public:
bool wordPattern(string pattern, string str) {
map<string, char> word_map;
char used[128] = {0}; //保存映射的pattern字符
int pos = 0; //相当于指针,指向 pattern
string word; //拆分出的单词
str.push_back(' '); //在最后加个空格,方便拆分单词
for(int i = 0; i < str.length(); ++i)
{
if(str[i] == ' ')
{
// 拆分出单词后 分为 以下几种情况:
// 1 如果 pattern 比 str 长度小,即:单词还没拆分完,pattern没了。比如反例:str=“dog fish” pattern=“a”
if(pos == pattern.length())
{
return false;
}
// 2. 若单词 未出现 在 哈希映射中
if(word_map.find(word) == word_map.end())
{
// 2.1 判断当前字符是否已被使用.若 被 使用,则返回false
if(used[pattern[pos]]) //比如反例:str=“dog cat cat fish”, pattern=“abba”
{
return false;
}
// 2.2 若没有被使用,更新 哈希映射
word_map[word] = pattern[pos];
used[pattern[pos]] = 1;
}
else //3. 若单词 出现 在 哈希映射中
{
// 3.1 若当前 word 映射已经建立,但是无法 与pattern 匹配,则 返回 fasle
if(word_map[word] != pattern[pos])
{
return false; //比如反例:str=“dog cat cat fish”, pattern=“abca”
}
}
word = ""; //完成 一个单词的 判断后, 清空word
++pos; //指向 pattern 字符的指针后移
}
else
{
word += str[i];
}
}
//4 有多余的 pattern字符。 比如反例:str=“dog”, pattern=“aab”
if(pos != pattern.length())
{
return false;
}
return true;
}
};
感觉还是要系统的掌握知识。。。
比如这次的 哈希表 day2。。。
系统的学习之后,才能更加得心应手的运用~
2019/5/26 胡云层 于南京 87