LeetCode No3 无重复字符的最长子串

题目

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
  请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

提示:

0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成

思路

题目只需要求出不含有重复字符的最长子串的长度,只需要求长度的话就简单了,利用双指针的思想,先定义一个字符set,保存当前子串的所有字符,定义一个最长子串的开始坐标back,再定义一个最长子串的结束坐标front,最长字串长度max=Math.max(max, front-back+1) , 然后使用front遍历字符串,如果set里面没有包含当前遍历到的字符,则说明当前字符和之前的都不一样,直接front++,而如果set里面包含当前遍历到的字符,则说明之前有一样的字符,这个时候就需要将back移动至上一个同样的字符所在的坐标。

AC代码

点击查看代码
class Solution {
    public int lengthOfLongestSubstring(String s) {
        Set<Character> chars = new HashSet<Character>();
        int back = 0;
        int front = 0;
        int max = 0;
        while(front < s.length()) {
            char currentChar = s.charAt(front);
            if (!chars.contains(currentChar)) {
                chars.add(currentChar);
                int tmpMax = front - back + 1;
                if (tmpMax > max) {
                    max = tmpMax;
                }
            } else {
                char backChar = s.charAt(back);
                while(backChar != currentChar) {
                    chars.remove(backChar);
                    ++back;
                    backChar = s.charAt(back);
                }
                ++back;
            }
            ++front;
        }
        return max;
    }
}
posted @ 2022-04-07 21:42  Asimple  阅读(24)  评论(0编辑  收藏  举报