1. 程式人生 > >【判段同構】字串最小表示法

【判段同構】字串最小表示法

字串的最小表示法是什麼?
其實就是求字串S的同構S’中字典序最小的一個,返回是最小的首字元的下標。
舉一個例子:M(“bbcaab”) = 3。

最小表示法有什麼用?
可以判斷兩個字串是否同構,因為同構字串最小表示相同。

最小表示法如何操作?
首先設定i,j兩個指標,i=0,j=1;
起始 k = 0;
若a[i+k] == a[j+k],那麼(這裡就像以i開頭字串和以j開頭字串比較),k++,
若a[i+k] > a[j+k], 那麼顯然從i到i+k都不會是最小表示,從i到j-1也不會是最小表示,所以i = min(j,i+k+1)。而j應該變成i+1。
若a[i+k] < a[j+k}, 那麼將j = j+k+1即可。

最小表示法模板?

int Minrepresentation(char *s,int len)
{
    int i = 0; j = 1; k = 0;
    while(i < len && j < len && k < len)
    {
        if(s[i+k] < s[j+k])
        {
            j = j+k+1;
            k = 0;
        }
        else if(s[i+k] > s[j+k])
        {
            i = max(j,i+k+1
); j = i+1; k = 0; } else k++; } return min(i,j); }

隨手打的,沒測過

相關推薦

字串表示

字串的最小表示法是什麼? 其實就是求字串S的同構S’中字典序最小的一個,返回是最小的首字元的下標。 舉一個例子:M(“bbcaab”) = 3。 最小表示法有什麼用? 可以判斷兩個字串是否同構,

字串表示(LeetCode 899. Orderly Queue )

A string S of lowercase letters is given.  Then, we may make any number of moves. In each move, we choose one of the first K letters (sta

字串表示 O(n)演算法

網上看了這篇文章後還是感覺有些地方講的沒有詳細的證明所以添加了一點 紅色字是博主寫的 求字串的迴圈最小表示: 上面說的兩個字元串同構的,並沒有直接先求出Min(s),而是通過指標移動,當某次匹配串長時,那個位置就是Min(s)。而這裡的問題就是:不是給定兩個串,而是給出一個串,求它的Min(s),eg:M

CH1807 NecklaceHash字串表示

1807 Necklace 0x18「基本資料結構」練習 背景 有一天,袁☆同學綿了一條價值連城寶石項鍊,但是,一個嚴重的問題是,他竟然忘記了項鍊的主人是誰!在得知此事後,很多人向☆同學發來了很多郵件,都說項鍊是自己的,要求他歸還(顯然其中最多隻有一個人說了真話)。 ☆同學要求每個人都寫了一段關

字串迴圈——表示の板子

字串的最小表示 一個字串S通過迴圈移位能夠得到一些別的字串,比如“abcde”迴圈一次可以得到“bcdea”,迴圈兩次得到“cdeab”,等等。這些串當中字典序最小的那個就叫做S的最小表示。 求出字串的最小表示可以方便地判斷兩個串是否迴圈同構。 某些別的求

表示 字串迴圈問題

  用最小表示法返回最小表示串(字典序最小的同構串)第一個字元在原始串中的下標。   用兩個指標i,j,i初始化為0,j初始化為1,用k表示當前已經匹配串的長度。如果str[i+k]==str[j+k],j++,否則如果str[i+k]>str[j+k],說明以i開始

POJ1635 Subway tree systems ——(判斷樹的,樹的表示

systems scan color end cto 同構 while scanf urn   給兩棵有根樹,判斷是否同構。因為同構的樹的最小表示法唯一,那麽用最小表示法表示這兩棵樹,即可判斷同構。順便如果是無根樹的話可以通過選出重心以後套用之前的方法。   AC代碼如下:

hdu3374 String Problem表示exKMP

output field can mis sep pan 題意 easy example String Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O

HDU2609——How many表示,set去重

How many Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4190 &nbs

經典動態規劃問題矩陣路徑和問題

題目內容: 有一個矩陣map,它每個格子有一個權值。從左上角的格子開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和。 給定一個矩陣map及它的行數n和列數m,請返回最小路徑和。保證行列數均小於等於100. 測試樣例:

學習筆記表示

用途             給定一個長度為n,可旋轉的字串環,求從哪個位置斷開的長度為n的字串字典序最小/大(以最小為例,最大同理)   演算法描述     &nbs

題解POJ 1509 Glass Beads 表示模板

ostream 字母 void stream ldr fine clu 輸出 ring vjudge 題目大意TLDR 有$n$個首尾相接的字符串,每個字符串均由小寫字母構成,要求在環上找到一個斷點,使得斷開後所得的字符串字典序最小。 若有多處斷點斷開所得的字符串相同

刷題之路矩陣路徑

有一個矩陣map,它每個格子有一個權值。從左上角的格子開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和。 給定一個矩陣map及它的行數n和列數m,請返回最小路徑和。保證行列數均小於等於100. 經典動態

hdu-2609 How many---表示模板+set

str AC lse ron max insert sin AS 最小表示法 題目鏈接: http://acm.hdu.edu.cn/showproblem.php?pid=2609 題目大意: 有n個有01組成的字符串,每個字符串都代表一個項鏈,那麽該字符串就是一個環狀的

字串表示初探 By cellur925

我們考慮有一個字串,可以從這個字串的不同位置出發,把這個字串大聲朗讀出來,當到字串末端的時候再從頭開始讀,直到回到“夢開始的地方”。 設字串長度為\(n\),那麼有\(n\)種不同的讀法。我們現在想要在這些讀法中找一個字串使得他字典序最小,如何快速求出? 我們當然可以用其他樸素的方法(這裡不再贅述),但其

KMP_字串表示_CH1802_Necklace

點此開啟題目頁面 思路分析:     方法一: 直接使用字串Hash和二分搜尋判斷兩個字串字典序大小關係, 容易給出時間複雜度為O(nlg(n))的解決方案, n為輸入字串的長度, 具體實現見如下AC程式碼: //CH1802_Necklace #include

51nod 1282 時鐘 (雜湊、字串表示

題目 題解 要判斷時鐘是否相同,只需將時鐘的指標排序後求出M個距離,然後看距離陣列是否是迴圈同構即可。 迴圈同構: abcd的迴圈同構有:abcd、bcda、cdba、dabc。 要判斷是否迴圈同構,可以求出距離陣列的最小表示。然後對這個最小表示陣

hdu 2609 How many(表示模板+set重)

題目連結: 解題思路: 題目大意: 有n個有01組成的字串,每個字串都代表一個項鍊,那麼該字串就是一個環狀的結構,求可以經過迴圈旋轉,最後不同的串有多少個。。 演算法思想: 將每個字串轉換成最小串,