最長不重複子串

2022-05-04 04:15:07 字數 1241 閱讀 7454

對於最長不重複子串,某個當前的字元,如果它與前面的最長不重複子串中的字元沒有重複,

那麼就可以以它為結尾構成新的最長子串;如果有重複,且重複位置在上乙個最長子串起始位置之後,

那麼就與該起始位置之後的稍短的子串構成新的子串或者單獨成乙個新子串。

舉個例子:例如字串「abcdeab」,第二個字元a之前的最長不重複子串是「abcde」,

a與最長子串中的字元有重複,但是它與稍短的「bcde」串沒有重複,於是它可以與其構成乙個新的子串,之前的最長重複子串「abcde」結束;

再看乙個例子:字串「abcb」,跟前面類似,最長串「abc」結束,第二個字元b與稍短的串「c」構成新的串;

這兩個例子,可以看出些眉目:當乙個最長子串結束時(即遇到重複的字元),新的子串的長度是與第乙個重複的字元的下標有關的,

如果該下標在上乙個最長子串起始位置之前,則dp[i] = dp[i-1] + 1,即上乙個最長子串的起始位置也是當前最長子串的起始位置;

如果該下標在上乙個最長子串起始位置之後,則新的子串是從該下標之後開始的。

因為查詢每個字母是否重複時,都要「回頭」去尋找,受啟發於最初的hash思路,我們可以用hash記錄元素是否出現過,

我們當然也可以用hash記錄元素出現過的下標,既然這樣,在dp方案中,我們何不hash記錄重複元素的位置,

這樣就不必「回頭」了,而時間複雜度必然降為o(n),只不過需要乙個輔助的常數空間visit[256],典型的空間換時間。

dp[i] = dp[i-1] + 1

貪心+hash即可解決

#include#include#includeusing namespace std;

void output(char * arr);

int visit[255];

int maxlen;

int maxindex;

/* lnrs dp + hash 優化 */

void lnrs_dp_hash(char * arr, int size)

elseelse

}if(curlen > maxlen)

}output(arr);

}void output(char * arr)

printf("the len of lnrs is %d\n",maxlen);

int i = maxindex;

while(maxlen--)

printf("\n");}

void main()

最長不重複子串

出處 勇幸 thinking 題 從乙個字串中找到乙個連續子串,該子串中任何兩個字元不能相同,求子串的最大長度並輸出一條最長不重複子串。本節從最直接的方法逐步優化,漸進探索了四種實現方式,並最終找到時間複雜度為o n 輔助空間為常數的方案,內容如下 基本演算法 使用hash dp方案 dp hash...

最長不重複子串

演算法參考 找到乙個字串中的乙個連續子串,這個子串內不能有任何兩個字元是相同的,並且這個子串是符合要求的最長的。例如輸入 abcbef 輸出 cbef o n 的演算法,具體思路如下 以abcbef這個串為例,用乙個陣列pos記錄每個元素曾出現的下標,初始化為 1。從s 0 開始,依次考察每個字元,...

最長不重複子串

題目鏈結 給定乙個字串,找到最長的子串,要求該子串中沒有重複的字元。例如 字串abcabcbb的不含重複字元的 最長 子串為abc,長度為 3。而bbbbbb的不含重複字元的 最長 子串為b,長度為 1。輸入格式 輸入包含多行,每一行對應乙個長度不超過 100 的輸出,直到遇到結束符為止。每行依次輸...