给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"是一个子序列,不是子串。
方法一:两个左右指针, 遇到不重复则加入set集合,遇到重复的则删除i的元素,继续右移指向下一个
class Solution {
public int lengthOfLongestSubstring(String s) {
int i=0,j=0;//i,j分别记录左右指针
int len=0;
Set<Character> set=new HashSet();
while(i<s.length()&&j<s.length()){
if(!set.contains(s.charAt(j))){//不重复
set.add(s.charAt(j));
len=Math.max(len,j-i+1);
j++;//不重复右移
continue;
} else{
set.remove(s.charAt(i++));//删除后右移
continue;
}
}
return len;
}
}
执行用时: 66 ms, 在Longest Substring Without Repeating Characters的Java提交中击败了56.33% 的用户
内存消耗: 25.5 MB, 在Longest Substring Without Repeating Characters的Java提交中击败了79.67% 的用户
方法二: 使用两个指针i,j,都从0开始,不断右移j指针,判断是否重复,重复右移i指针,j等于i,如果不重复加入str中,统计len长度。(效率不高)
class Solution {
public int lengthOfLongestSubstring(String s) {
int i=0,j=0;
int l=0;
int len=0;
String str="";
while(i<s.length()&&j<s.length()){
if(!str.contains(s.charAt(j)+"")){
str+=s.charAt(j);
l++;
if(len==0){
len=l;
}else{
if(len<l){
len=l;
}
}
} else{
i++;
str="";
j=i;
l=0;
continue;
}
if(++j>=s.length()){
i++;
str="";
j=i+1;
l=0;
}
}
return len;
}
}