ZOJ Problem Set - 1984 Genetic Code
題目的意思是:打印出一個由'N','O','P'三個字符組成的串,要求這個串中任意長度相鄰的子串均不能相同!
比如: NOPNO這種串是正確的。NOPNPNO這種串就不允許了,因爲中間出現了兩個長度爲2的相鄰的相同子串——"PNPN"。
輸入輸出:
Sample Input
1------------------>n, 表示串的長度,1<=n<=5000
2
10
20
0------------------>0表示輸入結束。
Sample Output
N
NO
NONPNOPNPO----------->根據輸入的n,打印出相應長度的串。
NONPNOPNPONOPNONPNOP
思路:
1.可以定義一個長度爲5000的字符數組,一次性將n=5000的串存入這個數組,之後就可以根據n的值直接輸出前n位字符,不用每次根據n重複的去計算。
2.在生成串的第i位時,這個位置只能選擇放與第i-1位不一樣的兩種字符,如果放一樣的,就存在了兩個長度爲1的相鄰的相同子串,所以第i位只有兩種選擇。在第i位放置字符後要進行檢查,如果第i位放這個字符,那是否會存在2個長度爲x( 1<=x<=i/2 )的相同子串呢?如果存在那就說明不能放這個字符。繼續選擇下一個字符。
3.如何檢查一個長度爲i的串是否存在2個長度爲x( 1<=x<=i/2 )的相同子串呢?
當你在放第i位時,你只需要檢查包含第i位的長度分別爲x( 1<=x<=i/2 )的子串的情況,因爲不包含第i位的子串其實已經在你放置前i-1位時檢查過了。