長度為n的序列,迴圈同構串中字典序最小的就是最小表示
序列 4 3 2 1 ,它的迴圈同構串為 3 2 1 4 ,2 1 4 3 ,1 4 3 2 ,其中字典序最小的就是1 4 3 2
我們最先想到的就是暴力列舉+判斷 ,可以對所給序列進行列舉所有的字典序,然後找出最小的字典序即可,但是我們列舉+判斷的時間複雜度是很高的,那麼我們繼續優化
我們可以將原串擴大一倍,,然後從指標指向的位置開始長度為n的串,就是迴圈同構串,那麼我們就可以設定兩個指標i(指向0) ,j(指向1) 然後開始往後比較,如果是s1 > s2,說明以s1開頭的串肯定是大於以s2開頭的串,那麼s1指標就應該後移到下乙個位置重新進行比較。繼續優化
我們可以提前預處理出乙個k,表示si==sj ,看圖,假設我們匹配到k之前 si 都是等於sj 的,當sk > sk+1 ,那麼i就可以移動到i+k+1,的位置上了,因為對於si–sk 中間這段,始終有sj—sk+1 比它小,
**是返回字典序最小的字串的開始下標
int
get_min
(char str)
int res =
min(i, j)
; str[res + n]=0
;return res;
}
字串迴圈同構的最小表示法
迴圈字串的最小表示法的問題可以這樣描述 對於乙個字串s,求s的迴圈的同構字串s 中字典序最小的乙個。由於語言能力有限,還是用實際例子來解釋比較容易 設s bcad,且s 是s的迴圈同構的串。s 可以是bcad或者cadb,adbc,dbca。而且最小表示的s 是adbc。對於字串迴圈同構的最小表示法...
最小表示法 字串迴圈同構問題
用最小表示法返回最小表示串 字典序最小的同構串 第乙個字元在原始串中的下標。用兩個指標i,j,i初始化為0,j初始化為1,用k表示當前已經匹配串的長度。如果str i k str j k j 否則如果str i k str j k 說明以i開始的同構串肯定不是最小的,並且以i開始的到以i k開始的都...
字串最小表示法
最小表示法的定義 給定乙個字串,不斷地把最後乙個元素移到最前面,可得有n個這樣的字串 稱這n個字串是迴圈同構的 那麼最小表示就是這n個裡面字典序最小的乙個 怎麼求最小表示 wrong 最樸素的方法,把每乙個這樣的字串求出來,然後一一比較,找到字典序最小的迴圈同構串 然後資料範圍變大肯定會超時 那麼正...