温承瑜 2023-04-11 23:34 采纳率: 68.4%
浏览 111

kmp模式匹配(统计子串t在主串s中出现的次数) (语言c++)


#include<string.h>
#include<iostream>
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
#define MAXSTRLEN 255 

void get_nextval(char T[], int nextval[])
{ 
    int i = 1, j = 0;
    nextval[1] = 0;
    while (i < T[0])
        if (j == 0 || T[i] == T[j])
        {
            ++i;
            ++j;
            if (T[i] != T[j])
                nextval[i] = j;
            else
                nextval[i] = nextval[j];
        } 
        else
            j = nextval[j];
}

Status Index_KMP(char S[], char T[], int pos, int next[])
{ 
    int i = pos, j = 1;
    while (i <= S[0] && j <= T[0])
        if (j==0||S[i]==T[j]) 
        {
            ++i;
            ++j;
        }
        else
            j=next[j]; 
    if (j > T[0]) 
        return i-T[0];
    else
        return 0;
}

Status times(char S[], char T[])
{ 
    int i = 1, j = 1;
    int times = 0;
    int next[MAXSTRLEN];
    get_nextval(T,next);
    while (i <= S[0] && j <= T[0])
    {
        if (j==0||S[i]==T[j]) 
        {
            i++;
            j++;
        }
        else
            j=next[j]; 
        if (S[i]==T[j]&&j == T[0]) 
        {
            times++;
            j=0;
        }
    }
    return times;  
     
}

int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        char S[MAXSTRLEN+1],T[MAXSTRLEN+1];
        char S1[MAXSTRLEN],S2[MAXSTRLEN];
        cin >> S1 >> S2;
        strcpy(&S[1],S1);
        strcpy(&T[1],S2);    
        S[0]=strlen(S1);
        T[0]=strlen(S2);
        int *p = new int[T[0]+1];
        get_nextval(T,p);
        cout<<Index_KMP(S,T,1,p)<<" "<<times(S,T)<<endl;
    }
    
    return 0;
}



img

img


能知道大概率是times++那部分if语句出了问题,但我不会改,求指教。

  • 写回答

1条回答 默认 最新

  • CQ.abc 2023-04-12 00:06
    关注

    试试可以不

    #include <string.h>
    #include <iostream>
    
    using namespace std;
    
    #define OK 1
    #define ERROR 0
    #define OVERFLOW -2
    typedef int Status;
    #define MAXSTRLEN 255
    
    void get_nextval(char T[], int nextval[]) {
        int i = 1, j = 0;
        nextval[1] = 0;
        while (i < T[0]) {
            if (j == 0 || T[i] == T[j]) {
                ++i;
                ++j;
                if (T[i] != T[j]) {
                    nextval[i] = j;
                } else {
                    nextval[i] = nextval[j];
                }
            } else {
                j = nextval[j];
            }
        }
    }
    
    Status Index_KMP(char S[], char T[], int pos, int next[]) {
        int i = pos, j = 1;
        while (i <= S[0] && j <= T[0]) {
            if (j == 0 || S[i] == T[j]) {
                ++i;
                ++j;
            } else {
                j = next[j];
            }
        }
        if (j > T[0]) {
            return i - T[0];
        } else {
            return 0;
        }
    }
    
    Status times(char S[], char T[]) {
        int i = 1, j = 1;
        int times = 0;
        int next[MAXSTRLEN];
        get_nextval(T, next);
        while (i <= S[0] && j <= T[0]) {
            if (j == 0 || S[i] == T[j]) {
                ++i;
                ++j;
            } else {
                j = next[j];
            }
            if (j > T[0]) {
                ++times;
                j = 1;
            }
        }
        return times;
    }
    
    int main() {
        int n;
        cin >> n;
        while (n--) {
            char S[MAXSTRLEN + 1], T[MAXSTRLEN + 1];
            char S1[MAXSTRLEN], S2[MAXSTRLEN];
            cin >> S1 >> S2;
            strcpy(&S[1], S1);
            strcpy(&T[1], S2);
            S[0] = strlen(S1);
            T[0] = strlen(S2);
            int* p = new int[T[0] + 1];
            get_nextval(T, p);
            cout << Index_KMP(S, T, 1, p) << " " << times(S, T) << endl;
            delete[] p;
        }
        return 0;
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 4月11日

悬赏问题

  • ¥15 我的R语言提示去除连锁不平衡时clump_data报错,图片以下所示,卡了好几天了,苦恼不知道如何解决,有人帮我看看怎么解决吗?
  • ¥15 在获取boss直聘的聊天的时候只能获取到前40条聊天数据
  • ¥20 关于URL获取的参数,无法执行二选一查询
  • ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
  • ¥15 marlin编译错误,如何解决?
  • ¥15 有偿四位数,节约算法和扫描算法
  • ¥15 VUE项目怎么运行,系统打不开
  • ¥50 pointpillars等目标检测算法怎么融合注意力机制
  • ¥20 Vs code Mac系统 PHP Debug调试环境配置
  • ¥60 大一项目课,微信小程序