查詢子串(字元出現重疊時如何處理)
阿新 • • 發佈:2021-12-05
本題在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; }