長度爲n的環狀串有n種表示法,分別爲從某個位置開始順時針得到。在這些表示法中,字典序最小的稱爲“最小表示”。
輸入一個長度爲n(n<=100)環狀DNA串(只包含A,C,G,T)的一種表示法。任務是輸出該環狀串的最小表示。例如,CTCC的最小表示爲CCCT,CGAGTCAGCT的最小表示爲 AGCTCGAGTC。
def less(s,p,q):
n=len(s)
for i in range (n):
if(s[(p+i)%n]!=s[(q+i)%n]):
return s[(p+i)%n]<s[(q+i)%n]
return 0
s="CTCC"
ans=0
len_s=len(s)
print(len_s)
for i in range(len_s):
if less(s,i,ans): ans=i
for i in range(len_s):
print(s[(i+ans)%len_s])
輸出爲
4
C
C
C
T
其實上面的這種寫法理解起來也挺簡單的。主要就是遍歷整個字符串,由ans保存當前的最小字典序的索引號,然後後面捅過less(s,i,ans)再去獲取更小的字典序索引號。之所以要%n取模是爲了能夠比較整個句子,而不是到n就截止,將這些字符排序變爲環形的。