问题描述:
给定一个字符串 s
,请你找出其中不含有重复字符的 最长 子串的长度。
解题思路:
使用哈希表解决确定子串是否有重复字符问题,在尽量短的不重复子串中找到不重复子串的最小长度,使用哈希表模拟队列,双指针表示队列两端,队尾进元素,队头出元素。
入队时需要将队列中重复的元素从队头不断弹出,保证队列中没有重复字符,然后在完成一次队尾元素入队后,更新最短子串的长度记录。
代码如下:
class Solution {//采用类似长度最小子数组的方式处理
//找尽量短的不重复的子串的最短长度
public int lengthOfLongestSubstring(String s) {
//用有序集合
HashMap<Integer,Character> hashMap=new HashMap<>();
//队列加法
int i=0,j=0;
int maxSubLength=0;
while(j<=s.length()-1){//j为待入队列的元素,不能越界,i永远会小于等于j
while(hashMap.containsValue(s.charAt(j))){
hashMap.remove(i++);//队头出
}
hashMap.put(j,s.charAt(j++));//队尾入
//这样保证子串无重复字符
maxSubLength=Math.max(maxSubLength,j-i);//左闭右开区间
}
return maxSubLength;
}
}
这道题时间和内存空间应该还是有优化空间的。