查找子串(字符出现重叠时如何处理)
本题在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; }