PTA 习题11-6 查找子串 (20分)题目

今天主要来分享pta上的一道查找子串问题。最近一直在刷pta上的题,发现蛮多趣味所在,它有很多测试点且必须每个都得通过。

首先你要把所有的给的测试用例通过这是基本要求,其次是还有许多考虑的因素要自己考虑到,当然这个需要一定的经验,慢慢积累吧!pta浙大版《C语言程序设计(第3版)》题目集说难也不难,说简单也不简单,很适合训练,个人认为最大优点是不像其他的oj平台有大量的算法题,对刚学完C语言且没学过数据结构与算法的新手很不友好啊!

习题11-6 查找子串 (20分)题目,有很多坑
比如测试例1如何实现有两个怎么实现呢
1,The C Programming Language
ram

代码如下,上面有讲解

char *search(char *s, char *t)
{
    int i=0,j=0,k;
    int sum=0;
    int m=0;
    while(t[i++]!='\0')
        m++;//没有string.h头文件,用循环表示字符串长度
    for(i=0;s[i]!='\0';i++)
    {
        while(t[j]!='\0')
        {
            if(s[i]==t[j])
            {
                j++;
            }
            sum++;//sum放在外面,不然下面的判断失去意义
            if(sum>=1&&sum!=j)//此情况是为了当有相同的字母,比如测试例1,第一个r相同,但第二个字母不相同的情况
            {
                j=0;//不相同就全部变成0
                sum=0;//s设置sum是为了与if判断
                break;
            }
            else//是为了案例1依次三个字母都相同的,不执行上面的if,就给我跳出,不然还会while的
                break;
        }
    if(j==m)//当刚好等于子串长度,就跳出for循环,因为while中每次都跳出啦!需要用if判断
        return &s[i-j+1];
    }
    return NULL;//最后一个没找到就返回空
}


在这里插入图片描述
当然肯定还有更好的办法来解决这个问题,比如用指针
但是总体的逻辑是无法改变的,大家可以自己多多尝试!加油!

下面是我用指针写的,其实都差不多,但是我写指针的时候发现一点需要纠正,不然就是部分正确的结果!

char *search(char *s, char *t)
{
    char *p,*q;
    int i,j=0,k=0;
    char *ch=s;
    while(t[j++]!='\0')
    {
        k++;
    }
    while(*ch!='\0')
    {
        if(*ch==*t)
        {
            p=ch;
            q=t;
            i=0;
            while(*q!='\0')//这里要来个判断,否则就是部分正确的结果,加油!
           {
               if(*p++==*q)
                {
                    i++;
                }
                q++;
           }
            if(i==k)
                return ch;
        }
        ch++;
    }
    return NULL;
}

在这里插入图片描述

仅供参考!

©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页