【字串迴圈同構的最小標記法】

來源:互聯網
上載者:User

迴圈字串的最小標記法的問題可以這樣描述:

對於一個字串S,求S的迴圈的同構字串S’中字典序最小的一個。

由於語言能力有限,還是用實際例子來解釋比較容易:
設S=bcad,且S’是S的迴圈同構的串。S’可以是bcad或者cadb,adbc,dbca。而且最小表示的S’是adbc。
對於字串迴圈同構的最小標記法,其問題實質是求S串的一個位置,從這個位置開始迴圈輸出S,得到的S’字典序最小。
一種樸素的方法是設計i,j兩個指標。其中i指向最小表示的位置,j作為比較指標。

令i=0,j=1
如果S[i] > S[j] i=j, j=i+1
如果S[i] < S[j] j++
如果S[i]==S[j] 設指標k,分別從i和j位置向下比較,直到S[i] != S[j]
         如果S[i+k] > S[j+k] i=j,j=i+1
         否則j++
返回i

起初,我想在j指標後移的過程中加入一個最佳化。就是j每次不是加1,而是移動到l位置。其中,l>j且S[l]<=S[j]。但是,即使加入這一最佳化,在遇到bbb…bbbbbba這樣的字串時複雜度將退化到O(n^2)。

注意到,樸素演算法的缺陷在於斜體的情況下i指標的移動太少了。針對這一問題改進就得到了最小標記法的演算法。最小標記法的演算法思路是維護兩個指標i,j。

令i=0,j=1
如果S[i] > S[j] i=j, j=i+1
如果S[i] < S[j] j++
如果S[i]==S[j] 設指標k,分別從i和j位置向下比較,直到S[i] != S[j]
         如果S[i+k] > S[j+k] i=i+k
         否則j++
返回i和j的小者

注意到上面兩個演算法唯一的區別是粗體的一行。這一行就把複雜度降到O(n)了。
值得一提的是,與KMP類似,最小標記法處理的是一個字串S的性質,而不是看論文時給人感覺的處理兩個字串。
應用最小標記法判斷兩個字串同構,只要將兩個串的最小表示求出來,然後從最小表示開始比較。剩下的工作就不用多說了。

int Minrp(char *s, int l){//s是要處理的字串,l是字串s長度    int i = 0, j = 1, k = 0, t;    while(i < l && j < l && k < l) {        t = s[(i+k) >= l ? i+k-l : i+k] - s[(j+k) >= l ? j+k-l : j+k];        if(!t) k++;        else{            if(t > 0) i = i + k + 1;//最大表示的話只要把t>0 改為t<0即可            else j = j + k + 1;            if(i == j) j++;            k = 0;        }    }    return i;}

附POJ 1509模板,跟ZOJ 1729差不多

#define N 10005char str[N];int Minrp(char *s,int l){    int i=0,j=1,k=0,t;    while(i<l && j<l && k<l){        t = s[(i+k) >= l ? i+k-l : i+k] - s[(j+k) >= l ? j+k-l : j+k];        if(!t)k++;        else {            if(t>0)i = i+k+1;            else j = j+k+1;            if(i==j)j++;            k = 0;        }    }    return i;}int main(){    int n;    int t;    scanf("%d",&t);    while(t--){        scanf("%s",str);        printf("%d\n",Minrp(str,strlen(str))+1);    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.