自我学习

给两个字符串A、B, 从A中找出第一次出现B的位置。

 

输入格式:

第一行输入一个整数n,表示测试数据的个数

 

对于每组测试数据,输入两个字符串S T,S和T中间用一个空格隔开,每组数据占一行。

 

输出格式:

对于每组测试数据,输出A中找出第一次出现B的位置,如果A不包含B,输出“not find!”

 

输入样例:

3

abcdabbcd abbc

abcd efg

abbcdd bbc

输出样例:

4

not find!

1


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

const int MAX = 10000;

void get_next(char str[],int len,int next[]);
int find(char s[],int len_s,char t[],int len_t,int next[]);

int main(){
    int cas,a;
    char s[MAX],t[MAX];
    int next[MAX]; 
    scanf("%d",&cas);
    while(cas--){
        scanf("%s %s",s,t);
        int len_s = strlen(s);
        int len_t = strlen(t);
        get_next(t,len_t,next);//构建部分匹配表
        a = find(s,len_s,t,len_t,next);//在s中查找t
        if(a == -1)
            printf("not find!\n");
        else
            printf("%d\n",a);
    }
    return 0;
}
//构建部分匹配表(Next数组)
void get_next(char str[],int len,int next[])
{
    int i = 0;
    int j = 0;
    next[0] = -1;
    for(i = 1;i<len;i++){
        while(j>0 && str[i] != str[j])
            j = next[j - 1];
        if(str[i] == str[j])
            j++;
        next[i] = j;
    }
}
//使用KMP算法在字符串s中查找第一次出现字符串t的位置
int find(char s[],int len_s,char t[],int len_t,int next[])
{
    int i = 0;
    int j = 0;
    while(i < len_s && j<len_t){
        //匹配字符
        if(j == -1 || s[i] == t[j]){
            j++;
            i++;
        }else{
            j = next[j];
        }
    }
    if(j == len_t)
        return i-j;//返回怕匹配的起始位置
    else
        return -1;//未找到匹配
}
复制代码
posted @   周+⑦  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示