1、双指针
我们可以遍历words中的每一个单词,利用指针i和j分别指向s和word。而后我们分别遍历s和word,统计相同字符出现的次数cnt1和cnt2。若满足以下条件:1、s和word中指向的字符相同;2、cnt1大于等于cnt2;3、cnt1 等于 cnt2 或 cnt1 大于等于 2则说明当前的字符串是合法的,可以继续遍历,否则直接跳出循环。最终我们比较当前两个字符串的指针是否指向末尾即可。
class Solution {
public:
int expressiveWords(string s, vector<string> &words) {
int res = 0;
for (string word: words) {
if (word.size() > s.size()) continue;
int i = 0, j = 0;
while (i < s.size() && j < word.size()) {
int cnt1 = 0, cnt2 = 0;
while (s[i + 1] == s[i] && i < s.size()) {
++i;
++cnt1;
}
while (word[j + 1] == word[j] && j < word.size()) {
++j;
++cnt2;
}
if (s[i] == word[j] && cnt1 >= cnt2 && (cnt1 == cnt2 || cnt1 >= 2)) {
++i;
++j;
} else {
break;
}
}
if (i == s.size() && j == word.size())
++res;
}
return res;
}
};