无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
思路:滑动窗口解法,定义一个做指针作为窗口左边界,定义一个右指针作为窗口有边界,遍历当前字符串,当出现重复时,记录当前重复字符的位置及当前窗口的长度,然后从重复字符下一个位置作为左边界,继续向右遍历。
class Solution {
public int lengthOfLongestSubstring(String s) {
//1.定义一个LinkedList存放当前遍历的字符,若出现冲突,则从0移除到当前重复元素的位置。
LinkedList linkedList = new LinkedList<>();
//2.获取字符串的长度
int strLen = s.length(),count = 0;
for(int i=0; i<strLen; i++){
Character c = s.charAt(i);
if(!linkedList.contains(c)){// 当前链表中包含此元素
linkedList.add(c);
count = Math.max(count,linkedList.size());
}else{// 放入失败,则从0移除到当前重复元素的位置,即窗口起始位置从第一个重复位置开始
int index = linkedList.indexOf(s.charAt(i));
for(int j=0; j<=index; j++){
linkedList.remove();
}
linkedList.add(c);
}
}
return count;
}
}
