想象一下,把乙個字串圍成乙個圈,再次字元圈的任意一處斷開,將會得到乙個新的字串。在按此法生成的字串中,字典序最小的稱為原字串的最小表示法,最大的稱為原字串的最大表示法。
那麼,我們怎麼求乙個字串的最小/大表示法呢?
思路一、
直接把這n個字串構造出來,然後排序。
時間複雜度o(n
logn
)o(nlogn)
o(nlog
n),空間複雜度o(n
2)
o(n^2)
o(n2
),tle
思路二、
這裡介紹乙個時間複雜度為o(n
)o(n)
o(n)
的演算法。下面以構造最小表示法為例,介紹演算法流程。
初始時規定i = 0, j = 1。
每次令k = 0, k累加至n - 1,判斷:s[(i + k) % n] 是否與s[(j + k) % n] 相同。如果相同則重複本步驟,否則進行下一步驟。
為方便描述,令x = (i + k) % n, y = (j + k) % n。
若s[x] > s[y],i = i + k
若s[x] < s[y],j++
返回min(i, j)
板子題:【hdu2609】
#include
#include
#include
#include
using
namespace std;
const
int mn =
105, mm =
10005
;struct nodeh[mm]
;char s[mn]
, a[mn]
;bool
cmp(node a, node b)
intmins
(int n)
}return
min(i, j);}
intmain()
sort
(h +
1, h +
1+ n, cmp)
;int sum =1;
for(i =
2; i <= n; i++)if
(strcmp
(h[i]
.s, h[i -1]
.s)!=0)
sum++
;printf
("%d\n"
, sum);}
}
字串的最小 大 表示法
迴圈字串的最小表示法的問題可以這樣描述 對於乙個字串s,求s的迴圈的同構字串s 中字典序最小的乙個。由於語言能力有限,還是用實際例子來解釋比較容易 設s bcad,且s 是s的迴圈同構的串。s 可以是bcad或者cadb,adbc,dbca。而且最小表示的s 是adbc。對於字串迴圈同構的最小表示法...
Vision 字串 最小(大)表示法
定義 求解問題 n個字串圍成乙個環,請從這個環中找出字典序最大 或最小 的 長度為n的字串 下標盡可能小 name 最小表示法 function 求解迴圈字串的最小字典序串 輸入引數 字串 字串長度 輸出引數 從某下標開始所得到的串字典序最小 下標最小 複雜度 o n include include...
字串最小表示法
最小表示法的定義 給定乙個字串,不斷地把最後乙個元素移到最前面,可得有n個這樣的字串 稱這n個字串是迴圈同構的 那麼最小表示就是這n個裡面字典序最小的乙個 怎麼求最小表示 wrong 最樸素的方法,把每乙個這樣的字串求出來,然後一一比較,找到字典序最小的迴圈同構串 然後資料範圍變大肯定會超時 那麼正...