问题:
给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。暴力解法:
找到无重复值的最长子串
------>先找到该字符串的所有子串 并且子串中不含有重复字符
------>比较所有子串,并且记录长度,找到最长的子串
思考:
找到所有不重复的子串 至少需要双重for循环来遍历字符串s,也就是说时间复杂度为O(n2)。
回到这个题目,我们发现最重要的两个点为:最长的字串,记录长度。
滑动窗口解决无重复字符串问题:
初始: start指针和end指针指向0
开始遍历字符串:end后移 窗口扩大
继续遍历字符串:end后移 出现重复值
start指针指向最后一个重复值
end指针继续后移 继续寻找最长的子串
以此类推 end指针后移 遇到相同值 start指针指向相同值
问题在于:怎么确定出现了重复值,以及start的怎么移动到重复值的位置
基于滑窗 可以使用map集合查找重复值
Map<Character, Integer> map = new HashMap<>();key:end指针所指字符 value:end字符所指的索引
public int lengthOfLongestSubstring(String s) {
if (s.length()==0) return 0;
//记录最大长度
int maxLength=0;
//记录字符串长度
int length=s.length();
//key:end所指的字符 value:end指针所在的位置 找出重复值
HashMap<Character, Integer> map = new HashMap<>();
//遍历整个字符串
for (int end = 0,start=0; end <length; end++) {
//
char current=s.charAt(end);
if (map.containsKey(current)){
//避免指针回移
start=Math.max(start,map.get(current)+1) ;
}
//记录最长的字串长度
maxLength=Math.max(maxLength,end-start+1);
map.put(current,end);
}
return maxLength;
}