題目
給定兩個字串 s1 和 s2, 要求判定 s2 是否能夠被通過 s1 作迴圈移位 ( rotate )
得到的字串包含. 例如, 給定 s1 = aabcd 和 s2 = cdaa, 返回 true; 給定
s1 = abcd 和 s2 = acbd, 返回 false.
解法1
直接模擬, 對 s1 進行迴圈移位, 在判斷字串 s2 是否在移位後的字串中.
c**
#include
#include
intmain()
src[j] = tempchar;
if (strstr(src, des) == 0)
}
printf("no\n");
getchar();
return 0;
}
#include #include int main()解法2其實沒必要對 s1 進行真正的移位, 依次從 s1[0], s1[1], ... 開始比較, 如果 s1 的下標超出範圍, 就對src[j] = tempchar;
if (strstr(src, des) == 0)
} printf("no\n");
getchar();
return 0;
}
其取餘, 這樣就相當於延長字串 s1 了.
c**
#include
#include
intmain()
if (k == len_des)
}
printf("no\n");
getchar();
return 0;
}
#include #include int main()解法3解法2通過取餘數的方法, 達到延長字串的目的, 當然這是一種偽延長, 我們也可以把if (k == len_des)
} printf("no\n");
getchar();
return 0;
}
s1 延長成 s1s1, 那麼對 s1 做迴圈移位所得到的字串都將是字串 s1s1 的子字串.
如果 s2 可以由 s1 迴圈移位得到, 那麼 s2 一定在 s1s1 上. 至此我們將問題轉換成考察
s2 是否在 s1s1 上, 可通過呼叫一次 strstr 函式得到結果.
總結
解法1直接模擬, 效率最低, 解法3是典型的空間換時間的做法, 解法2是解法1和解法3的折中,
既不需要額外的空間, 也不需要對字串做移動
本文出自:
程式設計之美3 1 字串移位包含問題
程式設計之美3.1 字串移位包含問題。判斷s2能否被s1做迴圈移位得到的字串包含,若直接判斷效率較低。可以將s1s1連線起來,如果s2可以通過迴圈移位得到,則s2一定是s1s1的子串,可以通過呼叫strstr得到。時間複雜度o n m 不過strstr的實現效率較低,可以使用kmp判斷是否是子串。每...
程式設計之美3 1 字串移位包含問題
這道題目的意思是給定乙個字串,作為源字串,之後給出其他的字串,確定源字串是否能夠經過旋轉而得到給定的字串,即移位包含問題。假如,給定乙個字串 abcdefg,接著給定字串 cdefgab,很顯然,給定的字串是可以經過源字串旋轉而得到的,但是,給定字串 cdegfab 就不能由源字串經過旋轉而得到。當...
程式設計之美3 1 字串移位包含問題
這道題目的意思是給定乙個字串,作為源字串,之後給出其他的字串,確定源字串是否能夠經過旋轉而得到給定的字串,即移位包含問題。假如,給定乙個字串 abcdefg,接著給定字串 cdefgab,很顯然,給定的字串是可以經過源字串旋轉而得到的,但是,給定字串 cdegfab 就不能由源字串經過旋轉而得到。當...