日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

最小表示法 最大表示法

發(fā)布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最小表示法 最大表示法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最大最下表示法都一樣。這里就說一個最小表示法吧!

?

最小表示法就是找出字符串S的的循環(huán)同構(gòu)串中字典序最小的一個。

?

那么什么是循環(huán)同構(gòu)串呢。是

--設(shè)S=bcad,且S’是S的循環(huán)同構(gòu)的串。S’可以是bcad或者cadb,adbc,dbca

即在字符串S中從i>=0開始,從i循環(huán)到字符串末尾,再從頭循環(huán)到i,所形成的字符就是S循環(huán)同構(gòu)串。

?

因為這樣的同構(gòu)串不止一個,所以我們要找出其中字典序最小的一個(即字符串從小到大排序,其中最小的一個)

為什么要找出其中最小的一個呢?我也不知道誒

最小表示法其實就是找到位置i,從這個位置輸出S,使得到的同構(gòu)串字典序最小

樸素算法的思想就不仔細(xì)說了,因為是O(n^2)復(fù)雜度

?

實現(xiàn)方法:

(1).利用兩個指針p1,p2。初始化時p1指向s[0],p2指向s[1]。

(2).k=0開始,檢驗s[p1+k]和s[p2+k]是否相等,相等則k++,一直下去,直到找到第一個不相同的字符(若k試了一個字符串的長度也沒找到不同,即整個串都是相同的字符。則那個位置就是最小表示位置,算法終止并返回)。該過程中s[p1+k]和s[p2+k]的關(guān)系有三種:

  1).s[p1+k]>s[p2+k],p1滑動到p1+k+1處,s[p1--p1+k-1]不會是循環(huán)字符串的"最小表示"的前綴。

  2).s[p1+k]<s[p2+k],p2滑動到p2+k+1處。

  3).s[p1+k]==s[p2+k],則k++,if(k==len)返回結(jié)果。

  若滑動后p1==p2,將正在變化的那個指針在+1.直到p1,p2把整個字符串都檢驗完畢,返回兩者中小于len的值。

(3).如果 k==len,則返回min( i , j )

  如果 p1>=len,返回 p2
  如果 p2>=len,返回p1當(dāng)中最小的
}

//最小表示法 int get_minstring(char *s) {int len = strlen(s);int i = 0, j = 1, k = 0;while(i<len && j<len && k<len){int t=s[(i+k)%len]-s[(j+k)%len];if(t==0)k++;else{if(t > 0)i+=k+1;elsej+=k+1;if(i==j) j++;k=0;}}return min(i,j); }//最大表示法 int get_maxstring(char *s) {int len = strlen(s);int i = 0, j = 1, k = 0;while(i<len && j<len && k<len){int t=s[(i+k)%len]-s[(j+k)%len];if(t==0)k++;else{if(t > 0)j+=k+1;elsei+=k+1;if(i==j) j++;k=0;}}return min(i,j); }

?

?

?

總結(jié)

以上是生活随笔為你收集整理的最小表示法 最大表示法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。