查找子串(字符出现重叠时如何处理)

本题在pta上的测试数据较松,可以发现一些问题

采用初始版本和改良版都可以过,但明显初始版是存在问题的,改良后则无问题

 

如 测试 progrram 查找 ram 时 , 如果采用第一个版本,此时会返回NULL

 

而采用第二个版本的话,当读到第一个r时不成立时,选择记录这个r的位置

在之后如果发现这个r之后的字符不满足t,那么让检测的位置回到r的下一位,这样就解决了这个问题

*******************************************************************************************************

本题要求实现一个字符串查找的简单函数。

函数接口定义:
char *search( char *s, char *t );

函数search在字符串s中查找子串t,返回子串t在s中的首地址。若未找到,则返回NULL。

裁判程序:

#include <stdio.h>
#define MAXS 30

char *search(char *s, char *t);
void ReadString( char s[] ); /* 裁判提供,细节不表 */

int main()
{
    char s[MAXS], t[MAXS], *pos;

    ReadString(s);
    ReadString(t);
    pos = search(s, t);
    if ( pos != NULL )
        printf("%d\n", pos - s);
    else
        printf("-1\n");

    return 0;
}

初始版本

char *search( char *s, char *t )
{
    int i, k = 0, number = 0;
    char* ch = 0;
    int flag = 0;
    for(i = 0; *(s+i) != '\0'; ++i)
    {
        while(*(t+k) == *(s+i) && *(t+k) != '\0')
        {
            flag = 1;
            if(k == 0)
            {
                ch = s+i;
            }
            k++;
            i++;
        }
        if(*(t+k) == '\0')
        {
            return ch;
        }
        else if(flag == 1)
        {
                        flag = 0;
            k = 0;
        }
    }
    return NULL;
}
    

 

改良版

char *search( char *s, char *t )
{
    int i, k = 0, number = 0;
    char* ch = 0;
    int flag = 0;
    for(i = 0; *(s+i) != '\0'; ++i)
    {
        while(*(t+k) == *(s+i) && *(t+k) != '\0')
        {
            flag = 1;
            if(k == 0)
            {
                ch = s+i;
                number = i;
            }
            k++;
            i++;
        }
        if(*(t+k) == '\0')
        {
            return ch;
        }
        else if(flag == 1)
        {
      flag = 0;
            i = number;
            //如果出现重叠情况,如progrram中寻找ram就需要将i置回原位,在进行+1操作
            //pta测试数据太松了 
            k = 0;
        }
    }
    return NULL;
}

 

posted @ 2021-12-05 19:57  柳碎花殇  阅读(76)  评论(0编辑  收藏  举报