最小表示法 最大表示法
最大最下表示法都一樣。這里就說一個(gè)最小表示法吧!
?
最小表示法就是找出字符串S的的循環(huán)同構(gòu)串中字典序最小的一個(gè)。
?
那么什么是循環(huán)同構(gòu)串呢。是
--設(shè)S=bcad,且S’是S的循環(huán)同構(gòu)的串。S’可以是bcad或者cadb,adbc,dbca
即在字符串S中從i>=0開始,從i循環(huán)到字符串末尾,再?gòu)念^循環(huán)到i,所形成的字符就是S循環(huán)同構(gòu)串。
?
因?yàn)檫@樣的同構(gòu)串不止一個(gè),所以我們要找出其中字典序最小的一個(gè)(即字符串從小到大排序,其中最小的一個(gè))
為什么要找出其中最小的一個(gè)呢?我也不知道誒
最小表示法其實(shí)就是找到位置i,從這個(gè)位置輸出S,使得到的同構(gòu)串字典序最小。
樸素算法的思想就不仔細(xì)說了,因?yàn)槭荗(n^2)復(fù)雜度
?
實(shí)現(xiàn)方法:
(1).利用兩個(gè)指針p1,p2。初始化時(shí)p1指向s[0],p2指向s[1]。
(2).k=0開始,檢驗(yàn)s[p1+k]和s[p2+k]是否相等,相等則k++,一直下去,直到找到第一個(gè)不相同的字符(若k試了一個(gè)字符串的長(zhǎng)度也沒找到不同,即整個(gè)串都是相同的字符。則那個(gè)位置就是最小表示位置,算法終止并返回)。該過程中s[p1+k]和s[p2+k]的關(guān)系有三種:
1).s[p1+k]>s[p2+k],p1滑動(dòng)到p1+k+1處,s[p1--p1+k-1]不會(huì)是循環(huán)字符串的"最小表示"的前綴。
2).s[p1+k]<s[p2+k],p2滑動(dòng)到p2+k+1處。
3).s[p1+k]==s[p2+k],則k++,if(k==len)返回結(jié)果。
若滑動(dòng)后p1==p2,將正在變化的那個(gè)指針在+1.直到p1,p2把整個(gè)字符串都檢驗(yàn)完畢,返回兩者中小于len的值。
(3).如果 k==len,則返回min( i , j )
如果 p1>=len,返回 p2
如果 p2>=len,返回p1當(dāng)中最小的
}
?
?
?
總結(jié)
以上是生活随笔為你收集整理的最小表示法 最大表示法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: zcmu1209(dfs)
- 下一篇: 机器学习笔记(十四)——HMM估计问题和