第3题 无重复字符的最长子串
题目
给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。注意 "bca" 和 "cab" 也是正确答案。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke"是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104s由英文字母、数字、符号和空格组成
思路
双指针思想,快指针遍历,判断字符中是否有重复来控制慢指针移动
使用list集合的前后端当作慢指针和快指针,因为list集合可以直接判断集合中是否有重复
创建一个list集合,因为list集合有序
直接对比字符是否存在
(这里使用while循环,因为有可能第一个字符不是重复字符,重复字符在字符串中间)
如果存在,直接去除列表中的第一个数据
最后再加上当前字符保证list集合中无重复字符
每次统计list集合的长度就可以统计出最大的长度
代码示例
import java.util.*;
public class lc3 {public static void main(String[] args) {Scanner scan = new Scanner(System.in);String str = scan.nextLine();lc3 lc = new lc3();int res = lc.lengthOfLongestSubstring(str);System.out.println(res);}public int lengthOfLongestSubstring(String s) {//转化为字符数组,更容易操作char[] chars = s.toCharArray();//使用list集合的前后端当作慢指针和快指针,因为list集合可以直接判断集合中是否有重复List<Character> list = new ArrayList<>();int max = 0;//快指针遍历添加数据for (int i = 0; i < chars.length; i++) {//慢指针剔除数据while(list.contains(chars[i])) {list.remove(0);}//剔除完数据添加快指针的数据list.add(chars[i]);//直接使用list集合长度统计无重复字符串的长度max = Math.max(max, list.size());}return max;}
}
