Word Pattern (Easy)
题目解析
题目提供了两个字符串,一个是只由小写字母组成的模式字符串,另一个是由小写字母和空格组成的单词字符串,题目要求判断所给的单词字符串与模式字符串中的模式是否相同,相同则返回true,否则返回false。例如"abab"和"dog cat dog cat"的模式相同则返回true。
思路
本题思路稍微比较复杂,我使用了哈希表来判断它们之间的模式是否相等,因为模式块是由26个小写字母组成的,所以我创建了一个大小为26的string数组来作为哈希表,由0~26依次表示’a’-‘z’,然后同时判断模块字符串和单词字符串,首先将单词字符串中的单词依次装进另一个字符串中,然后判断模式字符串中的字符对应的哈希表位置是否已经有单词放入,诺没有,则将整个哈希表遍历一遍,查看当前单词是否已经放到哈希表中的其他位置,诺没有则将该单词放到当前模式字符串的字符对应的哈希表中的位置,再继续判断后面的字符和单词。
简单的来说就是每个单词对应模块字符串中的每一个字符,然后在对照着哈希表检查该单词是否只在对应位置出现过,是则继续判断下一个单词,不是则返回false。
代码
bool wordPattern(string pattern, string str) {
string butter = str;
string s;
int biaoji = 0;
while (butter[biaoji] >='a'&&butter[biaoji]<='z') {
s.push_back(butter[biaoji++]);
}
string p = pattern;
string table[26];
int k = 0;
do {
biaoji++;
if (pattern.size() == 0)
return false;
int input = p[k++] - 'a';
if (table[input] == "") {
for (int i = 0; i<26; i++) {
if (table[i] == "") {
continue;
}
if (table[i] == s) {
return false;
}
}
table[input] = s;
}
else {
if (table[input]!=s) {
return false;
}
}
if(biaoji>=str.size()||k>=p.size())
break;
s="";
while (butter[biaoji] >='a'&&butter[biaoji]<='z') {
s.push_back(butter[biaoji++]);
}
} while (1);
if (k!=pattern.size()||biaoji<str.size())
return false;
return true;
}
结果
小结
遇到算法比较复杂的题目还是比较吃力,该题虽然想出来没那么难但实现起来还是比较麻烦的,特别是还要判断一些特殊情况,例如:字符串为空,单词与模块字符的数量不相等,等等。虽然难度还是Easy但是题目的复杂度跟之前的题目题目明显相差挺多,主要还是在算法的熟悉程度上有缺陷。