一、题目描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。
示例
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
二、解题思路
方法一:滑动窗口
思路:
1、存储元素最近的位置
2、计算不重复的窗口最大值,从重复的后一位开始计算
代码:
public int lengthOfLongestSubstring(String s) {
if(s.length()==0) return 0;
int i = 0,j=0;
int maxLen = 0;
//HashMap 存储元素值和元素所处的坐标
HashMap<Character,Integer> map = new HashMap<Character,Integer>();
for(j=0;j < s.length();j++){
//如果存在重复值了。取【原左边界】和【重复值的下一位】的最大值
if(map.containsKey(s.charAt(j))) i = Math.max(i,map.get(s.charAt(j))+1);
//存储当前元素的下标
map.put(s.charAt(j),j);
//计算当前窗口的长度
maxLen = Math.max(maxLen,j-i+1);
}
return maxLen;
}
复杂度分析:
1、时间复杂度:O(n) 。一次遍历nums。
2、空间复杂度:O(n) 。HashMap的额外空间。