字串的最小表示法

2021-08-26 15:23:07 字數 975 閱讀 4394

定義:給定乙個字串 s[1~n] ,如果我們不斷把他的最後乙個字元放到開頭,最終會得到 n 個字串,稱這 n 個字串是迴圈同構的。 這些字串中字典序最小的乙個,稱為字串 s 的最小表示。

例如 s = "abca",那麼它的 4 個迴圈同構字串為 "abca","aabc」,"caab","bcaa",s 的最小表示為 "aabc"。因為乙個與 s 迴圈同構的字串可以用該字串在 s 中的起始下標表示,所以我們就用 b[i] 表示從 i 開始的迴圈同構字串,即 s[i ~ n] + s[1 ~ i-1]。乙個字串的最小表示可以在 o(n) 的線性時間內求出。我們首先把 s 複製乙份接在它的結尾,得到的字串記為 ss 。顯然, b[i] = ss[i ~ i+n-1]。

最小表示法:

1、初始化 i = 1,j = 2。

2、通過直接向後掃瞄的方法,比較b[i] 與 b[j] 兩個迴圈同構串:

(1)、如果掃瞄了 n 個字元後仍然相等,說明 s 只由一種字元構成,任意 b[i] 都是它的最小表示。

(2)、如果在 i + k 和 j + k 處發現不相等:若 ss[i+k] > ss[j+k],令 i = i + k + 1。若此時 i = j,再令 i = i +1。

若 ss[i+k] < ss[j+k],令 j = j + k +1。若此時 i = j,再令 j = j+1。

3、若 i > n,b[j] 為最小表示;若 j > n,b[i] 為最小表示;否則重複第二步。

**實現:

int n = strlen(s+1);

for(int i = 1; i <= n; i++) s[n+i] = s[i];

int i = 1, j = 2, k;

while(i <= n && j <= n)else

}ans = min(i,j);

字串最小表示法

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

字串最小表示法

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

字串的最小表示法

mbp送去維修的第二天,想他。給定乙個字串s 1 n 如果我們不斷把它的最後乙個字元放到開頭,會得到n個字串,稱這n個字串是迴圈同構的。這些字串中字典序最小的乙個,稱為字串s的最小表示法。例如s abca 則它的4個迴圈同構字串為 abca aabc caab bcaa s的最小表示為 aabc 這...