字串的最長無重複子串 滑動視窗太牛逼

2021-10-09 15:06:04 字數 1473 閱讀 1248

「abcabcbb」

乙個字元乙個字元遍歷,a,b,c,然後又出現a

此時去掉第一次的a,然後繼續

又出現b,則應去掉一次的b,以此類推

最終發現最長的長度3

這相當於把所有的滑窗都找出來了把,邊找邊挑最大的

我一開始還很好奇:為啥可以直接擴大啊,萬一那個視窗在左邊好遠呢?這其實不會的,因為我們是邊生成邊挑最大的,且以後的視窗未必比先前的視窗大

維護res,每次用出現過的視窗大小來更新結果res,就可以得到最終結果

也就是更新的過程當中可能造成視窗變小的情形,但沒關係,最大的值已經被res記錄下來了

還有一種情況也需要計算最長無重複子串,就是當雜湊表中的值小於left,這是由於此時出現過重複的字元,left的位置更新了,如果又遇到了新的字元,就要重新計算最長無重複子串。

最後

你這個map裡的東西實際是每個字元出現的位置的+1,這不好理解的,還不如***寫的**

新增鏈結描述

我沒有完全按照上面的思路那樣寫

int map[

256]=;

for(

int j=

0;j<

256;j++

) map[j]=-

1;int res=1;

map[s[0]

]=0;

int left =0;

//最開始的時候left指向第乙個字母!

int i=

1;

int

lengthoflongestsubstring

(char

* s)

;for

(int j=

0;j<

256;j++

) map[j]=-

1;int res=1;

map[s[0]

]=0;

int left =0;

//最開始的時候left指向第乙個字母!

int i=1;

while

(s[i]

!='\0'

)else

//s[i]出現過哦!,那咋辦呢?

map[s[i]

]= i;

i++;}

return res;

}

#include

using

namespace std;

intmaxsubstr

(char

* str)

if(right-left>result)

result = right-left+1;

flag[

*p]=right;

p++;}

return result;

}int

main()

最長無重複子串 滑動視窗解法

class solution int n s.length int r 256 int map new int r 桶 字元的個數的 int left 0,right 0 視窗的兩個指標 int maxlen integer.min value 最後的結果 boolean notsamechar t...

leetcode 最長無重複子字串

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew 輸出 3 ...

字串 最長重複子串

乙個長度為10000的字串,寫乙個演算法,找出最長的重複子串,如abczzacbca,結果是bc trie 樹典型應用。字尾樹 package leetcode 乙個長度為10000的字串,寫乙個演算法,找出最長的重複子串,如abczzacbca,結果是bc public class longest...