1. 程式人生 > >《程式設計之美》--字串移位包含的問題

《程式設計之美》--字串移位包含的問題

對於這道題的前兩種思想書中已經給了比較詳細的解答,下面只是對於前兩種思想的小總結和對第三種思想的闡述。

第一種思想:

真正的移位,比較容易想,實現起來也沒什麼困難。

第二種思想:

移位過程中找到的規律,不論是左移還是右移,如果字串S2包含在S1S1中,那就說明S2可以由S1移位得到。

這裡補充一個C++ 標準庫中String類的一個小用法,c_str()函式(並不推薦使用它來複制字串,推薦使用strncpy和strcpy):

這個函式返回一個指向字串的const字元指標,是隻讀的,是一個臨時變數與字串的生存週期相同,不用考慮指標空間的釋放。

第三種思想:

模擬的移位,並不需要真正移位,對字串的下標取模運算的話即使下標超出了字串長度經過取模實際比較的還是字串中的字元。雖然用文字描述起來有些難懂,但是這個思想還是很好理解的!這種思想不需要像第二種思想那樣分配新的空間。

程式碼如下:

#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main()
{
    char src[]="password";
    char des[]="swordpas";
    int srcLen=strlen(src),desLen=strlen(des);
    int i=0,j=0;
    for(j=0;j<srcLen;j++){
        if(des[0]==src[j%srcLen]){
            //printf("%d\n",j);
            int k=j;
            for(i=1;i<desLen;i++){
                if(des[i]!=src[++k%srcLen]){
                    break;
                }
            }
            if(i==desLen)
                return 1;
        }
    }
    if(j==srcLen)
        return -1;
}