/*
* 算法思想:
* 使用暴力匹配法会超时。
* 将每个字母出现的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;
}
leetcode-792-匹配子序列的单词数-C语言
最新推荐文章于 2022-11-17 20:55:03 发布