アイデア:
スライディングウィンドウ。startとendは、それぞれスライディングウィンドウの開始と終了を表し、文字が繰り返されていない部分文字列を表します。マップを使用して、訪問したキャラクターの位置を記録します。スライドの仕方は、端が徐々に端に近づくことです。そして、プロセスの開始の値を維持します。endが繰り返される文字にアクセスすると、startを更新します。開始と終了の両方が大きくなることはでき、小さくすることはできないことに注意してください。
別の観点から見ると、実際、スライディングウィンドウは、最後に終わる最長および最長の部分文字列を表します。
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s == null) {
return 0;
}
int start = 0,end = 0,ans = 0;
HashMap<Character,Integer> map = new HashMap<>();
for(;end < s.length(); end++) {
if(map.containsKey(s.charAt(end))) {
start = Math.max(map.get(s.charAt(end)) + 1,start);
}
map.put(s.charAt(end),end);
ans = Math.max(ans,end - start + 1);
}
return ans;
}
}