字串的最小表示法

2021-09-25 15:13:13 字數 1003 閱讀 2969

<== 歡迎參觀!!

<== 歡迎參觀!!

字串的最小表示法,就是對於乙個字串,可以將它的最後一位放到第一位來,依次類推,一共有n種變形,n為字串長度

s = 「00ab」

變形有 : b00a, ab00, 0ab0

一共4種

那麼找到其中字典序最小的乙個,用的演算法便是這個。

定義三個指標,i, j, k,初始i=0;j=1;k=0。

首先:為什麼呢?

​ 首先s[i]到s[i+k-1]一定是大於等於s[i],因為如果其中有乙個數小於s[i],那麼這個數一定在s[j]到s[j+k-1]中存在,又因為必定有乙個會在後面,所以如果s[j]先碰到了,那麼一定不會繼續到k的位置的,所以一定不存在比s[i]小的字元。

​ 所以從其中的任意乙個字元開始當作起始點,都不會比現在更小,所以只有從選出來的序列的後面那乙個字元開始才有可能會是最小。

所以 j + = k+1

​ 如果序列中某個數和s[i]相等的話,那麼一定會有之前或者以後再這個位置起始過,所以不需要再從這個位置進行起始。

​ 因為在這裡i和j是等價的,i在前和j在前的結果是一樣的,所以i和j的處理是相同的,下面就不仔細的進行講解了,直接貼**:

還有就是如果i==j那麼讓j++就可以回到原先的狀態了

最後的時候,肯定是小的不會動,而大的會不停的向後移動,所以最後只需要輸出i和j最小的乙個即可

/**

*字串的最小表示法:

* *迴圈同構

*字串s = 「dcba」,它的迴圈同構"cbad",「badc」,「abcd」.

* *最小表示

*字串和它的所有迴圈同構中字典序最小的字串。s = 「dcba"的最小表示"abcd」

*/int

minrepresent

(char

*s,int len)

}return

(i? i:j;

}

字串最小表示法

最小表示法的定義 給定乙個字串,不斷地把最後乙個元素移到最前面,可得有n個這樣的字串 稱這n個字串是迴圈同構的 那麼最小表示就是這n個裡面字典序最小的乙個 怎麼求最小表示 wrong 最樸素的方法,把每乙個這樣的字串求出來,然後一一比較,找到字典序最小的迴圈同構串 然後資料範圍變大肯定會超時 那麼正...

字串最小表示法

乙個長度為n的首尾相連的字串可以有n種表示法,例如串 abcd 還可以表示bcda,cdab,dabc當我們面臨這樣的字串的時候,我們很難統計相同字串的個數。因此我們引入一種字串的最小表示法來使這些串變得相同。字串的最小表示法是將原來的字串旋轉得到的字典序最小的串 設字串st的長度為len,我們可以...

字串的最小表示法

定義 給定乙個字串 s 1 n 如果我們不斷把他的最後乙個字元放到開頭,最終會得到 n 個字串,稱這 n 個字串是迴圈同構的。這些字串中字典序最小的乙個,稱為字串 s 的最小表示。例如 s abca 那麼它的 4 個迴圈同構字串為 abca aabc caab bcaa s 的最小表示為 aabc ...