最小表示法就是找出字串s的的迴圈同構串中字典序最小的乙個。
那麼什麼是迴圈同構串呢。是
--設s=bcad
,且s』是s
的迴圈同構的串。
s』可以是
bcad
或者cadb,adbc,dbca
即在字串s中從i>=0開始,從i迴圈到字串末尾,再從頭迴圈到i,所形成的字元就是s迴圈同構串。
因為這樣的同構串不止乙個,所以我們要找出其中字典序最小的乙個(即字串從小到大排序,其中最小的乙個)
為什麼要找出其中最小的乙個呢?我也不知道誒
最小表示法其實就是找到位置i,從這個位置輸出s,使得到的同構串字典序最小。
樸素演算法的思想就是
讓i=0;j=1(i和j
如果
str[i]如果
//我們要讓i發起迴圈的串最小
str[i]>str[j];//說明i發起迴圈的串大於j發起的令i=j;j=j+1;
如果
str[i] ==str[j];//就引入乙個指標k,令k自加比較由i發起迴圈的串和j發起的串的餘下字元的大小
//直到str[i+k]!=str[j+k]或者kstr[j+k];//令i=j;j++;
下面是**:
//尋找字典序迴圈同構串
#include#includeusing namespace std;
int find_min_subs(string &str);
int main()
else if(str[i] < str[j])//說明j指向的串不是最小的,比較下乙個
else//相等,不能判斷兩個字串哪個小,比較下一位
int find_min_subs(string &str)//改進的演算法
} return i
最小表示法
最小表示法 思想 在字串迴圈同構問題中的應用 摘自周源的ppt 前言 最小表示法 比起動態規劃 貪心等思想,在當今競賽中似乎並不是很常見。但是在解決判斷 同構 一類問題中卻起著重要的作用。本文即將討論字串中的同構問題,如何巧妙地運用最小表示法來解題呢,讓我們繼續一起思考吧。到底什麼是迴圈同構的字串呢...
最小表示法
最小表示法與kmp演算法一樣都可以解決字串匹配問題,但效率更高,短,作用更大。最小表示法就是乙個字串的最小字典序。怎麼求乙個字串的最小字典序呢?首先將這個字串擴充套件一倍 建設存在d陣列裡 然後我們用三個指標i 0,j 1,k 0,來尋找最小字典序的開頭字母,為了優於kmp,我們要做到o n i表示...
最小表示法
最小表示法是判斷同構的一種方法,和hash一樣都有字串和樹的兩種 給定乙個字串,把它首尾相連形成字元環,然後從某個點開始的字串字典序最小,為該字串的最小表示 用兩個指標i,j,且k 0,然後若x i k x j k 則k 直到不等 若x i k x j k 那麼i k 1 x i k x j k 說...