1. 程式人生 > 其它 >查詢子串(字元出現重疊時如何處理)

查詢子串(字元出現重疊時如何處理)

本題在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;
}