1,题目要求
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.
给定两个字符串,一个表示pattern模式,一个表示等待判断的字符串——第二个字符串中单词出现的次序是否满足pattern的顺序。
2,题目思路
个人的思路是利用vector将字符数字化,然后通过比较数字来实现模式匹配。不过还是有点麻烦,将pattern进行数字化比较简单,但是将str中的字符串数字化比较麻烦。如何快速的读取str中的每个单词也是个问题。
首先,对于字符串中单词的读取,用到的是istringstream方法。这种方法在读取字符串时,会自动将空格作为分隔而读取对应的每个连续的字符串——在题目中为单词。
其次,在对单词进行数字化时,利用map容器是个更好的选择——既存有单词/字符,又有对应的数字(index)。
3,程序源码
class Solution {
public:
bool wordPattern(string pattern, string str) {
map<char, int> pattern2index;
map<string, int> str2index;
istringstream in(str);
int i =0, n = pattern.size();
for(string word;in>>word;i++)
{
if(i == n || pattern2index[pattern[i]] != str2index[word]) //i==n说明pattern和str长度不一致,无法匹配;
return false;
pattern2index[pattern[i]] = i+1;
str2index[word] = i+1;
}
return i == n;
}
};
需要注意的是:
if(i == n || pattern2index[pattern[i]] != str2index[word])
该语句表明,如果i==n时,说明word的数量多于pattern的长度,这时是肯定无法进行匹配的;
而对于两个map,如果对应的元素不再map,返回值为0,因此最开始的时或者二者都有新元素未加入到map中时,是不会返回false的。只有二者分别所对应的数字索引不相等时,才会返false。pattern2index[pattern[i]] = i+1;
str2index[word] = i+1;
分别对两个map更新字符/字符串——数字所对应的索引表,供之后的遍历使用。return i == n;
如果最后遍历完成并满足条件的话,i和n应该是相等的;因为也会有那种str的长度仅仅为一个单词的情况而导致输出出现错误,因此需要判断具体的遍历情况。