字符串问题 【微软面试100题 第八十五题】

题目要求

  已知一个字符串,比如adserwsde,寻找其中的一个子字符串比如sde的个数,如果没有就返回0,有的话返回子字符串的个数。

题目分析

  对KMP算法稍加修改一下就行:在应该返回字符串的地方进行计数。

代码实现

复制代码
#include <stdio.h>
#include <string.h>

void compute_prefix(int *next, char *p);
int kmp_match(char *text, char *p, int *next);

int main()
{
    int   next[101], n;
    char  *p = "caca" ;
    char  *text = "abcacacaca" ;

    compute_prefix(next, p);
    printf( "num = %d\n",kmp_match(text, p, next));

    return 0;
}
void compute_prefix(int *next, char *p)
{
    int         i, n, k;

    n = strlen(p);
    next[1] = next[0] = 0;
    k = 0;             /* 第i 次迭代开始之前, k表示next[i-1] 的值*/     
    for (i = 2; i <= n; i++) {
        if (p[k] == p[i-1])
            k++;
        else
            k = 0;
        next[i] = k;
    }
}
int kmp_match(char *text, char *p, int *next)
{
    int   m, n, s, q,num=0;

    m = strlen(p);
    n = strlen(text);
    q = s = 0;   /* q表示上一次迭代匹配了多少个字符,
                 s 表示这次迭代从 text的哪个字符开始比较*/
    while (s < n) {
        for (q = next[q]; q < m && p[q] == text[s]; q++, s++);
        if (q == 0) s++;
        else if (q == m) {
            num++;
            next[q] = 0;//一定要清零,不然输出个数会增加
        }
    }
    return num;
}
复制代码

 

posted on   tractorman  阅读(207)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?

导航

统计

点击右上角即可分享
微信分享提示