又一道挺不錯的深度優先搜索題

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位時檢查過了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章