对于这种中间有重复字母的匹配,可以顺序记录字母并且记录字母重复的个数,匹配字母如果能匹配则首先必须顺序上具有和目标字符串相同的字母顺序,其次再考虑题目中给的个数限制,如题所述,目标字符必须达到3或者3以上且比匹配字符个数大。在字母顺序相同的前提下,令目标字符串中顺序字符的个数为C1,匹配字符串中顺序字符的个数为C2,那么能匹配的情况如下,
- C1 == C2 —匹配
- C1 > C2 && C1 > 3 —p匹配
- C1 < C2 --不匹配
typedef struct {
char ch;
int len;
} ChInfo;
void Generate(ChInfo *chinfo, char *s, int *chinfoCount)
{
int schCount = 0;
int lenS = strlen(s);
for (int i = 0; i < lenS; ++i) {
char ch = s[i];
schCount = 1;
while ((i + 1 < lenS) && s[i + 1] == s[i]) {
++i;
schCount++;
}
chinfo[(*chinfoCount)].ch = ch;
chinfo[(*chinfoCount)++].len = schCount;
}
}
bool IsMatch(ChInfo *schInfo, int schCount, ChInfo *tchInfo, int tchCount)
{
printf("matching...%d, %d\n", schCount, tchCount);
if (schCount != tchCount) {
return false;
}
for (int i = 0; i < schCount; ++i) {
if (schInfo[i].ch != tchInfo[i].ch || schInfo[i].len < tchInfo[i].len) {
return false;
}
if (schInfo[i].len != tchInfo[i].len && schInfo[i].len < 3) {
return false;
}
}
return true;
}
int expressiveWords(char * s, char ** words, int wordsSize){
int lenS = strlen(s);
if (lenS == 0 || lenS == 0) {
return 0;
}
int schCount = 0;
int tchCount = 0;
int matchOK = 0;
ChInfo schInfo[100] = {0};
ChInfo tchInfo[100] = {0};
Generate(schInfo, s, &schCount);
for (int j = 0; j < wordsSize; ++j) {
tchCount = 0;
Generate(tchInfo, words[j], &tchCount);
if (IsMatch(schInfo, schCount, tchInfo, tchCount)) {
matchOK++;
}
}
return matchOK;
}