leetcode-3. 无重复字符的最长子串

93 阅读1分钟

1.问题描述

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

示例1

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

示例 2

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

示例 3

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

2.问题分析

涉及到字符串子串问题,一般使用滑动窗口算法。

解题思路

  1. 滑动窗口使用左右双指针确定窗口的范围,设定左右指针分别为left,right;
  2. 定义变量chars用来记录字符串是否出现过,同时标记该字符重复后左指针的跳转地址;
  3. 开始时左右指针分别都指向字符串的首字符;
  4. 循环开始后,右指针以此向右移动,对每个字符进行判断;
  5. 如果字符x出现在当前的子串中即chars[x]>左指针所在索引,说明有重复字符,则记录最长子串长度,并左移左指针到对应字符记录的下一跳位置。
class Solution {
    public int lengthOfLongestSubstring(String s) {
        // 最长子串长度
        int max_len = 0;
        // 字符串重复后的跳转指针
        int chars[] = new int[255];
        int i =0,j = i;
        for(; i< s.length() && j < s.length(); j++)
        {
            if (chars[s.charAt(j)] > i)
            {// 重复
                max_len = Math.max(max_len, j -i);
                i = chars[s.charAt(j)];
            }
            chars[s.charAt(j)] = j + 1;
        }
        max_len = Math.max(max_len, j -i);
        return max_len;
    }
}