给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
(比如 [sss ------> 1] [pdd------> 2] [abcabcbb ------> 3])
主要思想是滑动窗口:
实现代码1:(不借助map)
public class Solution{
public int subStringLength(String s){
if(s == null || s.length == 0){
return 0;
}
char[] chars = s.toCharArray();
/** 滑动窗口的左边下表 **/
int left = 0;
/** 目标字符串长度 **/
int len = 0;
for(int max = 0; max < chars.length; max++){
/** 用来区分该次遍历是否有重复数字,存在重复数字,长度是max之前的元素长度, 不存在重复数字,长度是包含max以及之前的元素长度 **/
int flag = 0
for(int j = left; j < max; j ++){
if(chars[max] == chars[j]){
flag = 1;
len = len > max - left ? len : (max - left);
/** 左侧角标滑动 **/
left = j + 1;
break;
}
}
if(flag == 0 && len < max - left + 1){
len = max - left + 1;
}
}
return len;
}
}
实现代码2(借助map)
public int lengthOfLongestSubstring1(String s) {
if (s.length()==0) return 0;
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
int max = 0;
int left = 0;
for(int i = 0; i < s.length(); i ++){
if(map.containsKey(s.charAt(i))){
left = Math.max(left,map.get(s.charAt(i)) + 1);
}
map.put(s.charAt(i),i);
max = Math.max(max,i-left+1);
}
return max;
}