3. 无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
解题思路
使用滑动窗口 ,窗口的边界用 快指针 f 和 慢指针 l 表示。滑动窗口中的字符串不允许有重复的字符,则滑动窗口的大小就是每次字符串的大小,找出滑动窗口最大的值即可。
Code(java)
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> map = new HashMap<>();
char ss[] = s.toCharArray();
int f, l, max = 0;
f = l = 0;
while (f < ss.length) {
//判断 快指针 走到的字符在 map 中是否存在
if (map.containsKey(ss[f])) {
//存在,则说明窗口中有重复的字符 则计算max值,移动慢指针即可
max = Math.max(max, f - l);
map.remove(ss[l]);
l++;
} else {
//不存在,则说明没有重复的,移动快指针即可
map.put(ss[f], null);
f++;
}
}
max = Math.max(max, f - l);
return max;
}
}
Eclipse: /LeetCode/src/_19_month4/Q3_无重复字符的最长子串.java