迴圈陣列中,使用字典序最小的乙個序列來表示這個陣列。例如a[5] = ,則最小表示法為。
輸入兩組資料,這兩組資料都是迴圈陣列或者環狀陣列,判斷這兩組資料是否一致?
設兩個陣列分別為a,b。
正常解題思路:使用兩個for迴圈進行o(n * n)次判斷即可
kmp方法:將a複製乙份加到a後面,然後再a中查詢是否存在b字串,但kmp演算法太複雜,難記憶,需要求next。
最小表示法,思路一:將a,b都用最小表示法表示出來,然後進行判定
最小表示法,思路二:將a,b各自複製乙份加到自己後面,然後具體思路如下:
步驟一:i為a的下標,j為b的下標,k為i和j同時移動的步數,初始化i = 0, j = 0, k = 0.
步驟二:如果a[i] == b[j],k++。如果a[i] > b[j],i = i + k + 1。如果b[j] > a[i],j = j + k + 1。關於為什麼a[i] > b[j] 時,i = i + k + 1。
證明是這樣的,因為a[i] -- > a[i + k] 肯定不為最小表示數,加入再[i, i + k]區間中,存在x是最小表示數,則在b中必然存在b[j + x - i, j + k] < a[x, i + k]。與假設矛盾。
步驟三:如果i < len && j < len && k == len,則兩個陣列一致,否則不一致。
/*
測試資料:
69867
76896
*/#include const int nmax = 200;
char str1[nmax], str2[nmax];
char s1[nmax], s2[nmax];
int main()
} printf("%s\n", flag == 1 ? "yes" : "no"); }}
//最小表示法的另一種運用,直接返回陣列s中最小表示數
int getmin(char s, int len)//s也可以定義為其他型別
k = 0;
} return i < j ? i : j;//返回i,j中較小的乙個
}
字串處理 最大最小表示法
樸素演算法 令 i 0,j 1,其中i指向最小表示的位置,j指向比較位置 若 s i s j 則 i j,j i 1 若 s i s j k 則 i j,j i 1 否則 j 最後返回 i 即可 最小表示演算法 令 i 0,j 1,那麼 若 s i s j 則 i j,j i 1 若 s i s j...
字串最小表示法
最小表示法的定義 給定乙個字串,不斷地把最後乙個元素移到最前面,可得有n個這樣的字串 稱這n個字串是迴圈同構的 那麼最小表示就是這n個裡面字典序最小的乙個 怎麼求最小表示 wrong 最樸素的方法,把每乙個這樣的字串求出來,然後一一比較,找到字典序最小的迴圈同構串 然後資料範圍變大肯定會超時 那麼正...
字串最小表示法
乙個長度為n的首尾相連的字串可以有n種表示法,例如串 abcd 還可以表示bcda,cdab,dabc當我們面臨這樣的字串的時候,我們很難統計相同字串的個數。因此我們引入一種字串的最小表示法來使這些串變得相同。字串的最小表示法是將原來的字串旋轉得到的字典序最小的串 設字串st的長度為len,我們可以...