最长不重复子串
请从字符串中找出一个最长的不包含重复字符的子字符串,并计算该最长子字符串的长度。
示例
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
解题
1.滑动窗口,哈希表
1.判空
2.初始化:窗口的开始值,窗口长度,最大子串的开始值,长度,哈希表
3.循环:
判断当前位置字符
<1> 在哈希表中:同时字符在窗口范围内,则更新滑动窗口的起始值和长度。
<2> 不在哈希表中:滑动窗口长度++。如果窗口长度>当前最大子串长度,更新最大子串的开始值,长度
当前位置字符放入哈希表,重复则覆盖
4.根据最大子串的开始值和长度返回子串,并且此时长度就是最大子串的长度
这种解法的重点是求出最长不重复子串,顺便求出子串长度。
class Solution {
/**
滑动窗口,哈希表
*/
public int lengthOfLongestSubstring(String s) {
if(s == null || s.length() == 0) return 0;
int start = 0, len = 0;
int startindex = 0, maxlen = 0;
String result="";
Map<Character,Integer> map = new HashMap<>();
for(int i = 0; i < s.length(); i++){
char ch = s.charAt(i);
Integer value = map.get(ch);
if(value != null && value >= start){ //保证窗口中都是不重复的子串
start = value + 1;
len = i - value;
}else{ //不在哈希表 或者 哈希表中已经存在但是在窗口外面
len++;
if(len > maxlen){
maxlen = len;
startindex = start;
}
}
map.put(ch,i);
}
result = s.substring(startindex,(startindex + maxlen));
return maxlen;
}
}