問題描述:
給定乙個文字檔案作為輸入,查詢其中的最長子字串。例如, 」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 50000char
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...