·题目描述
给定一个字符串 s
,请你找出其中不含有重复字符的 最长
子串
的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"
,所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
·解题思路
1.考虑队列,可以双端操作。
2.当没有重复元素的时候,元素从队尾进入队列。
3.当出现重复的时候,先计算当前队列的长度,更新最大子列的长度。并且从队头不断弹出元素,直到将重复的元素弹出,这时候再将重复元素入队。
4.重复上述操作,直到所有元素都完成一次遍历
·解题代码:
import java.util.ArrayList;
import java.util.List;
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length();
int max =0, cur = 0;
List<Integer> set = new ArrayList<Integer>();
for(int i = 0; i < n ;i ++){
int num = s.charAt(i);
if(set.contains(num)){
cur = set.size();
max = Math.max(max, cur);
while(set.get(0) != num){set.remove(0);}
set.remove(0);
set.add(num);
}
else{
set.add(num);
}
cur = set.size();
max = Math.max(max, cur);
}
return max;
}
}