Description
Examples
Notes
Solution 1(C++)
class Solution {
public:
bool wordPattern(string pattern, string str) {
vector<string> strvec;
size_t found=str.find(" "), i=0;
while(found!=string::npos){
strvec.push_back(str.substr(i,found-i));
i=found+1; found=str.find(" ",i);
}
strvec.push_back(str.substr(i));
unordered_map<char,int> mp;
unordered_map<string,int> ms;
for(int j=0;j<pattern.size();j++){
if(mp[pattern[j]]!=ms[strvec[j]]) return false;
mp[pattern[j]]=j+1;
ms[strvec[j]]=j+1;
}
return true;
}
};
Error
Solution 2(C++)
class Solution {
public:
bool wordPattern(string pattern, string str) {
vector<string> strvec;
size_t found=str.find(" "), i=0;
while(found!=string::npos){
strvec.push_back(str.substr(i,found-i));
i=found+1; found=str.find(" ",i);
}
strvec.push_back(str.substr(i));
unordered_map<char,int> mp;
unordered_map<string,int> ms;
if(pattern.size()!=strvec.size()) return false;
for(int j=0;j<pattern.size();j++){
if(mp[pattern[j]]!=ms[strvec[j]]) return false;
mp[pattern[j]]=j+1;
ms[strvec[j]]=j+1;
}
return true;
}
};
算法分析
要做这道题,就不得不提起前两天做过的一道题:LeetCode-205. Isomorphic Strings。
两道题的核心思想都是一样的。都是想判断一个字符串是否满足另一个字符串的形式。
这道题解法一与解法二其实主体思路都一样,只是出现如Error中所示,当pattern与string长度相同时,后面的索引就会报错。
还需要注意的一点就是:
mp[pattern[j]]=j+1;
ms[strvec[j]]=j+1;
为什么要用j+1。而我最开始用的是++。因为为了区别不同位置对应的值。如果都是++的话,就无法区分“abba”,中a与b的位置了。
程序分析
这次我尝试用string.find()函数来实现提取string中空格分隔的各个单词。如下:
vector<string> strvec;
size_t found=str.find(" "), i=0;
while(found!=string::npos){
strvec.push_back(str.substr(i,found-i));
i=found+1; found=str.find(" ",i);
}
strvec.push_back(str.substr(i));
现在知道了如何在LeetCode中进行代码调试。所以做题效率应该可以大大提高。
然后还是多注意临界条件的判断,在保证主体逻辑正确的情况下,多考虑考虑特殊情况。其实说白了,还是在写代码的时候要多注意一些限制条件。比如:ms[strvec[j]]=j+1; 在写这句的时候就应该知道由于j是以pattern的长度为上限的,所以这里不能严格保证strvec有j的索引。就需要加入特殊条件的判断:
if(pattern.size()!=strvec.size()) return false;