「最小表示法」思想
在字串迴圈同構問題中的應用(摘自周源的ppt)
前言:
「最小表示法」比起動態規劃、貪心等思想,在當今競賽中似乎並不是很常見。但是在解決判斷「同構」一類問題中卻起著重要的作用。
本文即將討論字串中的同構問題,如何巧妙地運用最小表示法來解題呢,讓我們繼續一起思考吧。
到底什麼是迴圈同構的字串呢?
直接舉個例子:
比如 str1 = "abdea" 而字串str2是str1從第i(i>0)個開始將str1從i迴圈到末尾再從頭開始迴圈到i,那麼這兩個字串就是迴圈同構的.比如str2 = "deaab";
那麼什麼是字串的最小表示呢?
比如上面那個str1,就是從str1的同構字串中字典序最小的,那麼str1的最小表示就是"aabde".
如何得到乙個字串的最小表示?
設函式m(s)返回值意義為:
從s的第m(s)個字元引起的s的乙個迴圈表示是s的最小表示。
若有多個值,則返回最小的乙個
比如m("bbbaab") = 4; 也就是最小表示為aabbbb,是從字串"bbbaab"的第4個的字元開始的同構字串。
現在換一種思路:
設有字串s1,s2 設
u=s1+s1(也就是將s1複製乙份到s1後面)
,w=s2+s2
並設指標
i,j指向
u,w第乙個字元
s1和s2是迴圈同構的,那麼當
i,j分別指向
m(s1),m(s2)
時,一定可以得到
u[i→i
+|s1|-1]=w[
j→j+|s2|-1]
,迅速輸出正確解。
s1和s2迴圈同構時,當
i,j分別滿足
i≤m(s1),
j≤m(s2)
時,兩指標仍有機會達到
i=m(s1),j=m(s2)
這個狀態。
問題轉化成,兩指標分別向後滑動比較,如果比較失敗,如何正確的滑動指標,新指標
i』,j』
仍然滿足
i』≤m(s1),
j』≤m
(s2)
設指標i,j
分別向後滑動
k個位置後比較失敗(k≥
0),即有
u[i+k]≠
w[j+k]設
u[i+k
]>w[
j+k]
,同理可以討論
u[i+k
]j+k
]的情況。
u[x]在u[
i]後(x-i)
個位置,
對應的可以找到在
w[j]
後(x-i)
個位置的
w[j+(x-i)]
,同樣對應的有
u[x+1]
和w[j+(x+1-i)]
,u[x+2]
和w[j+(x+2)-i]
,直到u[i+k-1]
和w[j+k-1]
。它們都是相等的, 即有
u[x→i+k-1]=w[j+(x-
i)→j+k-1]
。很容易就得到
u[x→i+k
]>w[j+(x-i)→
j+k]。所以
s1(x-1)
不可能是
s1的最小表示!
因此m(s1)>
i+k,指標i
滑到u[i+k+1]
處仍可以保證小於等於
同理,當
u[i+k
]j+k
]的時候,可以將指標j滑到
w[j+k+1]
處!也就是說,兩指標向後滑動比較失敗以後,
指向較大字元的指標向後滑動
k+1個位置。
舉例:
設s1=『babba』,s2=『bbaba』。(兩個同構字串)
u=s1+s1='babbababba' w=s2+s2='bbababbaba'
初始化i=0,j=0,k=0;(i作為u的指標,j作為w的指標)
比較失敗時k=1 (u[i+k]!=w[j+k]
由於u[i+k]
j = 2 i不變(i=0); k=0
繼續比較發現當k=0時u[i+k]>w[j+k],所以i=i+k+1;
i=1,j不變(j=2);k=0;
繼續比較,發現當k=2時u[i+k]>w[j+k]所以i = i+k+1;
i = 4j不變(j=2)k=0;
繼續比較,這個時候就找到了最小表示ababb
下面是自己的理解:
把乙個長為len的字串圍成乙個圈,然後以任意乙個字元作為起點,都會產生乙個新的長為len的字串,字串的最小表示就是所有新字串中字典序最小的那個。其返回值為字典序最小的串的在原串中的起始位置。基本想法就是兩個位置的字元比較,如果s[i+k] > s[j+k]那麼i到i+k位置都不是最小表示的位置,所以i直接跳k+1步,反之j直接跳k+1步。
改進的**:
code:
int min_sub(string str)
return i;//返回從第i個字元開始時str的最小表示
}
最小表示法
最小表示法就是找出字串s的的迴圈同構串中字典序最小的乙個。那麼什麼是迴圈同構串呢。是 設s bcad 且s 是s 的迴圈同構的串。s 可以是 bcad 或者cadb,adbc,dbca 即在字串s中從i 0開始,從i迴圈到字串末尾,再從頭迴圈到i,所形成的字元就是s迴圈同構串。因為這樣的同構串不止乙...
最小表示法
最小表示法與kmp演算法一樣都可以解決字串匹配問題,但效率更高,短,作用更大。最小表示法就是乙個字串的最小字典序。怎麼求乙個字串的最小字典序呢?首先將這個字串擴充套件一倍 建設存在d陣列裡 然後我們用三個指標i 0,j 1,k 0,來尋找最小字典序的開頭字母,為了優於kmp,我們要做到o n i表示...
最小表示法
最小表示法是判斷同構的一種方法,和hash一樣都有字串和樹的兩種 給定乙個字串,把它首尾相連形成字元環,然後從某個點開始的字串字典序最小,為該字串的最小表示 用兩個指標i,j,且k 0,然後若x i k x j k 則k 直到不等 若x i k x j k 那麼i k 1 x i k x j k 說...