「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...