2021-08-05 力扣809

在这里插入图片描述
对于这种中间有重复字母的匹配,可以顺序记录字母并且记录字母重复的个数,匹配字母如果能匹配则首先必须顺序上具有和目标字符串相同的字母顺序,其次再考虑题目中给的个数限制,如题所述,目标字符必须达到3或者3以上且比匹配字符个数大。在字母顺序相同的前提下,令目标字符串中顺序字符的个数为C1,匹配字符串中顺序字符的个数为C2,那么能匹配的情况如下,

  1. C1 == C2 —匹配
  2. C1 > C2 && C1 > 3 —p匹配
  3. 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值