字串最小表示法

2021-09-27 06:57:41 字數 881 閱讀 3193

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

字串的最小表示法是將原來的字串旋轉得到的字典序最小的串

設字串st的長度為len,我們可以在該字串後面再接乙個相同的字串,然後比較for i 0->len 比較st[i,i+len]的大小來找出最小的,複雜度(n^2)

int get_min(string st)

}return i>j?j:i;//較大的串的起點會不斷向後移動,知道超過st.size(),因此小的那個時最小串的起點

}

當我們在比較st[ i ~ i+len ]與st[ j ~j+len ] 時,發現前k個元素相等及st[ i ~ i+k ]==st[ j ~ j+k],而st[i+k+1]>st[j+k+1]時,按照一般的方法,我們令j++,繼續判斷st[ i ~ i+len ]與st[ j+1 ~j+1+len ]。然而,我們可以以發現st[ i+1 ~ i+k ]==st[ j+1 ~ j+k],st[i+k+1]>st[j+k+1],及st[i+1 ~ i+1+len]的字典序小於st[j+1 ~ j+1+len],因此我們沒有必要判斷st[ i ~ i+len ]與st[ j+1 ~j+1+len ]的大小,因為st[j+1 ~ j+1+len]一定不是最小的,同樣以j~j+k之間的任何個字元開頭的串都不是最小因此,我們令j=j+k+1。同樣的,當st[i+k+1]i=i+k+1

字串最小表示法

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

字串最小表示法 O(n 演算法

網上看了這篇文章後還是感覺有些地方講的沒有詳細的證明所以新增了一點 紅色字是博主寫的 求字串的迴圈最小表示 上面說的兩個字串同構的,並沒有直接先求出min s 而是通過指標移動,當某次匹配串長時,那個位置就是min s 而這裡的問題就是 不是給定兩個串,而是給出乙個串,求它的min s eg min...

字串的最小表示法

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