題目描述:
Given a string, find the length of the longest substring without repeating characters.
For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3.
For "bbbbb" the longest substring is "b", with the length of 1.
給定一個字符串,找到不重複的最長子字符串的長度。 例如,“abcabcbb”的不含重複字符的最長子字符串是“abc”,其長度爲3.對於“bbbbb”,無重複字符的最長的子字符串是“b”,長度爲1。
注意:子串是連續的。
題目解析:
"滑動窗口":例如abcabccc,
當從左向右掃描到abca的時候,得把第一個a刪掉得到bca,
然後"窗口"繼續向右滑動,
每當加入一個新char的時候,左邊部分檢查有無重複的char,然後如果沒有重複的就正常添加,有重複的話就左邊扔掉一部分(從最左到重複char這段扔掉),
在這個過程中記錄最大窗口長度。
import java.util.HashMap;
public class Solution {
public int lengthOfLongestSubstring(String s) {
if(s == null || s.length() < 1) {
return 0;
}
//HashMap<字符,下標>
HashMap<Character,Integer> map = new HashMap<Character,Integer>();
int windowBegin = 0;
int windowMax = 0;
for(int i=0; i<s.length();i++){
char c = s.charAt(i);
//窗口左邊可能爲下一個char,或者不變
windowBegin = Math.max(windowBegin,(map.containsKey(c))? map.get(c)+1:0);
windowMax = Math.max(windowMax, i-windowBegin+1);//當前窗口長度
map.put(c,i);
}
return windowMax;
}
}