LeetCode:3.无重复字符的最长字串(longest-substring-without-repeating-characters)
包含输入的完整代码可去LeetCode:3.无重复字符的最长字串(longest-substring-without-repeating-characters)Java完整代码
题目描述
思路
这是典型的滑动窗口问题,即通过滑动窗口来找到最长的字串,我们来看一下具体过程:
首先字符串abcabcbb如下:
然后在字符串第一个位置展开窗口
此时,窗口的起始位置start=0,终止位置end=0(注意字符串也是从0开始的),窗口的长度为length=end-start+1=1
此时窗口内还没有重复元素,所以end向右移动一位,得到:
此时start=0,end=1,并且窗口内没有重复元素,此时窗口的长度为length=end-start+1=2
窗口继续向右移动:
start=0,end=2,窗口内没有重复元素,窗口长度为length=end-start+1=3,
窗口继续向右移动就会发现,此时窗口的下一个元素为a,而这个元素已经在窗口中出现了,所以,我们需要调整窗口的起始位置,即start需要向右移动,直到将不出现重复元素,所以,我们可以简单得到start的位置为元素a的下一个位置,那么此时的窗口就为:
然后窗口继续移动,就将a元素包含在内,窗口的最大长度依旧为3
依次向右移动窗口
遍历完成后可得知窗口的最大长度为3
时间复杂度为O(n),n为字符串的长度
代码如下:
class Solution {
public int lengthOfLongestSubstring(String s) {
int length=0;
Map<Character,Integer> map=new HashMap<>();
for(int end=0,start=0;end<s.length();end++){
char c=s.charAt(end);
if(map.containsKey(c)){
start=Math.max(map.get(c)+1,start);
}
length=Math.max(end-start+1,length);
map.put(s.charAt(end),end);
}
return length;
}
}