1.问题描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例1
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
2.问题分析
涉及到字符串子串问题,一般使用滑动窗口算法。
解题思路
- 滑动窗口使用左右双指针确定窗口的范围,设定左右指针分别为left,right;
- 定义变量chars用来记录字符串是否出现过,同时标记该字符重复后左指针的跳转地址;
- 开始时左右指针分别都指向字符串的首字符;
- 循环开始后,右指针以此向右移动,对每个字符进行判断;
- 如果字符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;
}
}