字尾樹求最長子字串

2021-09-22 08:59:46 字數 1705 閱讀 1908

問題描述:

給定乙個文字檔案作為輸入,查詢其中的最長子字串。例如, 」ask not what your country can do for you, but what you can do for your country"中的「 can do for you"就是最長子字串。

解題過程:

這個問題最直接的解法就是變位詞程式(《程式設計珠璣》2.4節)。如果將輸入字串儲存在c[0..n-1]中,那麼我們可能會使用類似下面的偽**比較每個子串;

maxlen = -1

;for i = [0

, n]

for j =(i, n)

if (thislen = comlen(&c[i], &c[j])) >maxlen

maxlen =thislen;

maxi =i;

maxj = j;

comlen函式返回其兩個引數字串中共同部分的長度,從第乙個字元開始比較:

int comlen(char* p, char*q)

return

i; }

該演算法需要的時間複雜度為o(n^2)。可以用雜湊表搜尋短語中的單詞來實現提速,但是這裡有另乙個跟好的演算法:

我們將使用「字尾陣列」的簡單簡單結構。

#define maxn 50000

char

c[maxn];

char*a[maxn];

char

ch;

int n = 0

;

while ((ch = getchar()) !=eof)

c[n] = 0;

如果c中儲存的是「banana」,該陣列的字尾陣列內容就是:

a[0] = "banana"

a[1] = "anana"

a[2] = "nana"

……然後對其進行排序,可以使用qsort來進行,對排序完的陣列只需要一邊掃瞄,統計相鄰單詞共有子串的長度。

思路就是這樣,完整的**如下:

#include #include 

#include

#define maxn 50000

int comlen(char* p, char*q)

return

i; }

int cstring_cmp(const

void *a, const

void *b)

intmain()

c[n] = 0

; qsort(a, n,

sizeof(char*), cstring_cmp);

int maxlen = 0

;

int len = 0

;

int maxi = 0

;

for (int i = 0; i < n - 1; i++)

}printf(

"maxlen:%d\tmax string:\t

", maxlen);

char

ch_tmp;

for (int i = 0; i < maxlen; i++)

printf("\n

");return0;

}

求字串中不含重複字元的最長子串

今天逛脈脈,在上面看到乙個求字串中不含重複字元的最長子串,如果突然看到這個題,當時真的是寫不出,更何況最優解了,這個題以前出去面試的時候被考到過,當時也沒有寫出來,所以在網上看了這道題的答案後自己試著寫了下,並將自己的理解記錄下來 總體思路 1.設定兩個游標,一左一右,剛開始都設定成0,設定乙個se...

求一串字串中的最長子串

運用了集合來操作 計算的字串,中文字串也可以 string s asdfasdf char chararray s.tochararray mapstring listmap new hashmapstring 1.為每個腳標開始的字元建立乙個list集合,並用map集合儲存腳標與這個對應集合 fo...

c 求字串內無重複字元的最長子串

int lengthoflongestsubstring char s if isok else i i count 1 count 0 return longlenth int lengthoflongestsubstring char s if isok else count i start 1...