网站救助计划
1.为阅读体验,本站无任何广告,也无任何盈利方法,站长一直在用爱发电,现濒临倒闭,希望有能力的同学能帮忙分担服务器成本
2.捐助10元及以上同学,可添加站长微信lurenzhang888,备注捐助,网站倒闭后可联系站长领取本站pdf内容
3.若网站能存活下来,后续将会持续更新内容
题目描述
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
- s.length <= 40000
算法
(哈希表,双指针算法) O(n)
用哈希表存储每个字符出现的次数,且保证区间 [i, j] 内没有重复元素,每个字符只出现一次;res 记录答案。
双指针扫描字符串
- 每次将 s[i] 加入到哈希表中
- 如果 s[i] 出现的次数超过 1,说明在 [j, i – 1] 中有重复元素,此时移动 j 指针直到区间 [j, i] 中没有重复元素为止。
- 计算区间长度即当前不含重复字符的字符串的长度,更新 res,
res = max(res, i - j + 1)
。
时间复杂度
i, j 最多扫描一遍字符串,所以时间复杂度为 O(n)
空间复杂度
O(n)
C++ 代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<int, int> cnt;
int res = 0;
for (int i = 0, j = 0; i < s.size(); i ++ ) {
cnt[s[i]] ++ ;
while (cnt[s[i]] > 1) cnt[s[j ++ ]] -- ;
res = max(res, i - j + 1);
}
return res;
}
};
Java 代码
class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> cnt = new HashMap<>();
int res = 0;
int j = 0;
for (int i = 0; i < s.length(); i ++ ) {
char c = s.charAt(i);
cnt.put(c, cnt.getOrDefault(c, 0) + 1);
while (cnt.get(c) > 1) {
char d = s.charAt(j);
cnt.put(d, cnt.get(d) - 1);
j++;
}
res = Math.max(res, i - j + 1);
}
return res;
}
}
Python 代码
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
cnt = {}
res = 0
j = 0
for i in range(len(s)):
if s[i] in cnt:
cnt[s[i]] += 1
else:
cnt[s[i]] = 1
while cnt[s[i]] > 1:
cnt[s[j]] -= 1
j += 1
res = max(res, i - j + 1)
return res
本文由读者提供,Github地址:https://github.com/tonngw
点击面试手册,获取本站面试手册PDF完整版