字串的最小 大表示法

2021-09-08 14:05:39 字數 1248 閱讀 9695

想象一下,把乙個字串圍成乙個圈,再次字元圈的任意一處斷開,將會得到乙個新的字串。在按此法生成的字串中,字典序最小的稱為原字串的最小表示法,最大的稱為原字串的最大表示法。

那麼,我們怎麼求乙個字串的最小/大表示法呢?

思路一、

直接把這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 最樸素的方法,把每乙個這樣的字串求出來,然後一一比較,找到字典序最小的迴圈同構串 然後資料範圍變大肯定會超時 那麼正...