class huadong_windows {
//最长不重复子串长度
public int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
Map<Character, Integer> map = new HashMap<>();
for (int end = 0, start = 0; end < n; end++) {
char alpha = s.charAt(end);
if (map.containsKey(alpha)) {
start = Math.max(map.get(alpha)+1, start);
}
ans = Math.max(ans, end - start + 1);
map.put(s.charAt(end), end);
}
return ans;
}
public static void main(String[] args){
huadong_windows h = new huadong_windows();
String s = "pwwkew";
int ans = h.lengthOfLongestSubstring(s);
System.out.println("最长不重复子串长度为:"+ans);
}
}
思考:
无重复子串就是利用华东窗口来维护窗口左边的值和窗口右边的值,用map来存储已经加入窗口的字符以及下标,右边不断将新的字符加入到窗口中,如果重复则将左边界更新为map中已有重复值下标+1,这样窗口中就没有重复值了,同时在遍历过程中维护一个窗口大小值ans=end-start+1,维护过程一直取最大值即可,最终返回。