今天主要来分享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;
}
仅供参考!