给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 解析: 这道题主要用到思路是:滑动窗口 其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要滑动窗口,将左边的字符a移除,并且要记录下当前需要的数据 如何移动? 我们只要把队列的左边的元素移出就行了,直到满足题目要求!
代码:
/**
* 利用map解析
* @param s
* @return
*/
public static int lengthOfLongestSubstring(String s) {
int maxSize = 0;
//记录ASCII 码字符出现的位置,以字符作为下标
int [] dict = new int[256];
//基线坐标
int base = 0;
int key = 0;
for (int i=0;i<s.length();i++){
key = s.charAt(i);
if(dict[key] > base){
//基线坐标更新为重复的字符坐标
base = dict[key];
}
//记录字符本次次出现的下标位置
dict[key] = i+1;
maxSize = (maxSize>i-base+1)?maxSize:i-base+1;
}
return maxSize;
}
/**
* 利用字符数组
* @param s
* @return
*/
public static int method2(String s){
int maxSize = 0;
//记录ASCII 码字符出现的位置,以字符作为下标
Map<Character,Integer> dict = new HashMap<>(16);
//基线坐标
int base = 0;
for (int i=0;i<s.length();i++){
char ch = s.charAt(i);
if(dict.containsKey(ch)){
//基线坐标更新为重复的字符坐标
base = dict.get(ch)>base?dict.get(ch):base;
}
//记录字符本次次出现的下标位置
dict.put(ch,i+1);
maxSize = (maxSize>i-base+1)?maxSize:i-base+1;
}
return maxSize;
}