70 lines
1.4 KiB
Markdown
70 lines
1.4 KiB
Markdown
|
|
# 无重复字符的最长子串
|
||
|
|
|
||
|
|
## 题目
|
||
|
|
|
||
|
|
给定一个字符串 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 由英文字母、数字、符号和空格组成
|
||
|
|
|
||
|
|
|
||
|
|
## 思路
|
||
|
|
|
||
|
|
- 滑动窗口
|
||
|
|
- 区间
|
||
|
|
- 不重复子串
|
||
|
|
- 维护
|
||
|
|
- 哈希表
|
||
|
|
- `HashMap<Character, Integer>`
|
||
|
|
|
||
|
|
## 代码
|
||
|
|
|
||
|
|
```java
|
||
|
|
class Solution {
|
||
|
|
public int lengthOfLongestSubstring(String s) {
|
||
|
|
// Init
|
||
|
|
int l = 0, r = 0;
|
||
|
|
Map<Character, Integer> map = new HashMap<>();
|
||
|
|
int ans = 0;
|
||
|
|
|
||
|
|
// Traverse
|
||
|
|
for (; r < s.length(); r++) {
|
||
|
|
char cur = s.charAt(r);
|
||
|
|
// EXIST
|
||
|
|
if (map.containsKey(cur)) {
|
||
|
|
l = map.get(cur);
|
||
|
|
ans = Math.max(ans, r - l);
|
||
|
|
l++;
|
||
|
|
map.put(cur, r);
|
||
|
|
}
|
||
|
|
// NOT EXIST
|
||
|
|
else {
|
||
|
|
map.put(cur, r);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return ans;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|