leetcode-792-匹配子序列的单词数-C语言

该博客围绕LeetCode 792题,主要探讨使用C语言求解匹配子序列的单词数问题,涉及相关算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 * 算法思想:
 * 使用暴力匹配法会超时。
 * 将每个字母出现的index用一个数组记录下来,同时记录其出现次数;
 * 匹配时,直接在该数组中寻找是否出现过该字母,并且该字母出现的index大于上次匹配的index 代码中的last。
 * 分别对每个单词进行匹配,累加结果即可。
 *
 */


#define LEN 0xffff
typedef struct node_t{
    int cnt;
    int ids[LEN];
}Node;

bool isSubsequence_solve(Node *arr, char * s){
    int last=-1, i=0, j;
    int flag = 0;
    while(s[i] != '\0'){
        flag = 0;
        for(j=0; j<arr[s[i]].cnt; j++){
            if(arr[s[i]].ids[j] > last){
                last = arr[s[i]].ids[j];
                i++;
                flag = 1;
                break;
            }
        }    
        if(!flag){
            break;
        }
        
    }
    
    if(s[i] == 0)
        return true;
    
    return false;
}

int numMatchingSubseq(char * S, char ** words, int wordsSize){
    int i, j;
    char *t = S;
    Node arr[256];
    int cnt = 0;
    
    memset(arr, 0, sizeof(arr));
    i=0;
    while(t[i]!=0){
        arr[t[i]].ids[arr[t[i]].cnt] = i;
        arr[t[i]].cnt++;
        i++;
    }
    
    for(i=0; i<wordsSize; i++){
        cnt +=  isSubsequence_solve(arr, words[i]);
    }
    
    return cnt;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值