LeetCode 809
Expressive Words
Problem Description:
给出一个字符串S和一个字符串数组vector<string>& words,遍历整个数组返回数组中可扩展成字符串S的字符串的数目。对于可扩展的定义,题目认为相同字符必须连续出现三次及以上才认为是可扩展的,若只出现两次是不可扩展的。
具体的题目信息:
https://leetcode.com/problems/expressive-words/description/- Example:
- Example 1
当输入为heeellooo
时,题目给出的字符串数组为"hello", "hi", "helo"
,显然e
和o
都是可扩展的,h
和l
都是不可扩展的,因此符合情况的字符串应该至少有一个h
、e
、o
和两个l
。 - Example 2
当输入为zzzzzyyyyy
时,题目给出的字符串数组为"zzyy", "zy", "zyy"
,显然z
和y
都是可扩展的,因此符合情况的字符串应该至少有一个z
和y
。
- Example 1
- Solution:
class Solution {
public:
int expressiveWords(string S, vector<string>& words) {
if (S.length() == 0||words.size() == 0)
return 0;
//用flag记录相同字符出现次数,count记录函数返回值
int flag = 0, k, j, count = 0;
for (int i = 0; i < words.size(); i++) {
string temp = words[i];
for (j = 0, k = 0; j < S.length()&&k<temp.length(); j++, k++) {
if (temp[k] == S[j]) {
while(S[j+1]==S[j]&&j<S.length()-1) {
//判断有多少个相同的字符,从而确定该字符是否可扩展
j++;
flag++;
}
//单个字符匹配
if (flag == 1) {
j--;
} else if (flag >= 2) {
//当首字符匹配且对应字符可扩展时,移动K跳过后面相同的字符
while(temp[k+1]==temp[k]&&k<temp.length()-1) {
k++;
}
}
} else {
//若出现对应位置字符不同,则该temp字符串不能扩展成S
break;
}
flag = 0;
}
//需要注意的是S的长度不得少于字符串数组中各字符串长度
if (j == S.length()&&k == temp.length()&&S.length()>=temp.length())
count++;
}
return count;
}
};