最長不重複子串

2021-06-26 16:18:10 字數 1325 閱讀 6338

演算法參考:

找到乙個字串中的乙個連續子串,這個子串內不能有任何兩個字元是相同的,並且這個子串是符合要求的最長的。例如輸入"abcbef",輸出"cbef"。

o(n)的演算法,具體思路如下:

以abcbef這個串為例,用乙個陣列pos記錄每個元素曾出現的下標,初始化為-1。從s[0]開始,依次考察每個字元,例如pos['a'] == -1,說明a還未出現過,令pos['a'] = 0,視為將『a』加入當前串,同時長度+1,同理pos['b'] = 1,pos['c'] = 2,考察s[3],pos['b'] != -1,說明'b'在前面已經出現過了,此時可得到乙個不重複串"abc",重新整理當前的最大長度,然後更新pos['b']及起始串位置。

過程如下:

1、建乙個256個單元的陣列,每乙個單元代表乙個字元,陣列中儲存上次該字元出現的位置;

2、依次讀入字串,同時維護陣列的值;

3、如果遇到衝突了,考察當前起始串位置到衝突字元的長度,如果大於當前最大長度,則更新當前最大長度並維護衝突字元的位置,更新起始串位置,繼續第二步。

#include #include using namespace std;

char* getmaxsubstr( char*str )

int currentstart = 0, currentlength = 0, maxstart = 0, maxend = 0;

int strlen = strlen(str);

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

else

currentstart = hash[str[i]] + 1; //更新當前最長的起點

hash[str[i]] = i; //更新字元出現的位置}}

if (maxend == 0)//沒有重複字元,返回源串

currentlength = strlen - currentstart; //當前長度

if(currentlength > maxend - maxstart)//如果當前長度最長

int maxlength = maxend - maxstart;

char* restr = new char[maxlength + 1];

memset(restr, 0, maxlength + 1);

strncpy(restr, str + maxstart, maxlength);

return restr;

}int main()

實戰題目:leet code longest substring without repeating characters

最長不重複子串

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

最長不重複子串

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

最長不重複子串

用visit陣列記錄出現過的地方 dp的時候注意乙個問題就可以 abcdacbd來看看如果遇到重複的該怎麼處理 遇到第二個a前都沒有問題,第二次遇到a,然後肯定是更新a的位置的dp 4 4 0 4,第二次遇到c,更新c的位置為dp 5 5 2 3 然後問題來了,第二次遇到b,從第乙個b和第二個b之間...