串中任意個連續的字元組成的子串行稱為該串的子串。 目標:輸入乙個非空的字串,判斷它是否可以由它的乙個子串重複多次構成。
說明: 輸入的字串只含有小寫英文本母,並且長度不超過10000。 輸出的可以是布林型別的值,也可以是 1 或 0,其中 1 表示可以由它的乙個子串重複多次 構成,0 相反,能表達出意思即可。
樣例1:
輸入: "abab"
輸出: true (或 1)
樣例2:
輸入:"aba"
輸出:false (或 0)
樣例3: 輸入:"abcabcabcabc"
輸出:true (或 1)
#include #include #include#include#define max 10000
int main()
lensub = len - 1 - match[len - 1];
if(len % lensub ==0&&lensub字串s的下標從0到n-1,n為字串長度,記s(i)表示s的第i位字元,s(i,j)表示從s的第i位到第j位的子字串,若i>j,則s(i,j)=」」(空串)。
match
陣列的定義為:match (i)=p,表示p為小於i且滿足s(0 , p) = s(i-p , i)的最大的p,如果不存在這樣的p,則match (i) = -1,顯然next(0) = -1。我們可以用o(n)的時間計算出match陣列。假設我們已知match (0),match (1),……,match (i-1) ,現在要求match (i),不妨設match (i-1) = j0,則由match陣列定義可知s(0 , j0) = s(i-1-j0 , i-1)。
若s(j0+1) = s(i),則結合s(0 , j0) = s(i-1-j0 , i-1)可知s(0 , j0+1) = s(i - (j0+1) , i),由此可知,match(i)=j0+1。
若s(j0+1)!=s(i)但s(match (j0)+1)=s(i),記j1=match(j0),則s(j1+1)=s(i),由match陣列的定義,s(0 , j1) = s(j0 - j1 , j0) = s(i - 1 - j1 , i - 1),即s(0,j1) = s(i - 1 - j1 , i - 1),由假設s(j1+1) = s(i),則s(0 , j1+1) = s(i - (j1+1) , i),故match (i) = j1+1。
同前兩步的分析,如果我們能找到乙個k,使得對於所有小於k的k0,s(j(k0)+1)!=s(i),但有s(j(k)+1) = s(i),則由match陣列的定義可以得到match (i)=j(k)+1,否則需進一步考慮j(k+1) = match (j(k)),如果我們找不到這樣的k,則match (i)=-1。
對於字串s,如果j滿足,0<=j<=n-1,且s(0,j) = s(n-1-j,n-1),令k=n-1-j,若k整除n,不妨設n=mk,則s(0,(m-1)k - 1) = s(k,mk - 1),即s(0,k-1) = s(k,2k-1) = …… = s((m-1)k - 1,mk - 1),即s滿足題設條件。故要判斷s是否為重複子串組成,只需找到滿足上述條件的j,且k整除n,即說明s滿足條件,否則不滿足。
利用已算出的
match
(n-1)
,令k=n-1-match (n-1),由c
可知,若k整除
n,且k,則s
滿足條件,否則不滿足。上述演算法的複雜度可證明為
o(n)。
字串長度C語言版
題目描述 在右側我們給出了乙個已經基本完成的程式,讀入了乙個字串,呼叫了乙個叫str len的函式來計算這個字串的長度,並輸出。聰明的你應該已經發現了,這個叫str len的函式並沒有完成,在不修改函式原型的情況下,請完成str len函式,實現我們上述的功能吧。樣例輸入 abcdefg 樣例輸出 ...
串 C語言版
部落格又改版了,越來越好了,真是令人欣慰 對於串來說最好的方式就是把下標為0的那個位置空出來,再最後再加乙個長度length 成功!n int zichuan yncunzichuan a,b printf 字串在 d處 n zichuan a c c.data 1 w c.data 2 a c.d...
在字串指定位置插入字串C語言版
任務描述 題目描述 編寫程式,輸入字串s1和s2以及插入位置f,在字串s1中的指定位置f處插入字串s2。如輸入 beijing 123 3,則輸出 bei123jing 輸入第一行和第二行分別輸入兩個字串s1和s2,第三行輸入插入位置f。每個字串的長度不超過100個字元。輸出輸出一行插入後的字串。測...