LeetCode(3)无重复字符的最长子串
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 “abcabcbb” ,没有重复字符的最长子串是 “abc” ,那么长度就是3。
给定 “bbbbb” ,最长的子串就是 “b” ,长度是1。
给定 “pwwkew” ,最长子串是 “wke” ,长度是3。请注意答案必须是一个子串,”pwke” 是 子序列 而不是子串。
设置一个flag作为每次的子串的头下标,设置maxlength座位最大子串长度,遍历字符串,使用HashMap存储每个字符以及对应下标。
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character,Integer> map=new HashMap<>();
int maxlength=0;
int flag=0; //flag代表当前子串的开头字符的下标
for(int i=0;i<s.length();i++){
//如果map中有该字符
if(map.containsKey(s.charAt(i))){
//将map中该字符对应的i值+1赋给flag(前提是该值大于flag,否则不变)
flag=Math.max(map.get(s.charAt(i))+1,flag);
if(i-flag+1>maxlength){
maxlength=i-flag+1;
}
}else{
if(i-flag+1>maxlength){
maxlength=i-flag+1;
}
}
map.put(s.charAt(i),i);
}
return maxlength;
}
}
ps重点:其中每次当遍历到map中已经有的字符时,将flag移到该字符对应的map值后一位,如果flag小于该map值,则flag不变。
flag=Math.max(map.get(s.charAt(i))+1,flag);