题目描述: 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3: 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。 解题思路: 使用滑动窗口的思想,维护一个窗口,窗口内的元素不重复,每次移动右边界,如果右边界的元素在窗口内出现过,则移动左边界,直到窗口内不再有重复元素。 代码实现:
时间: 2023-07-16 22:16:25 浏览: 552
leetcode双人赛-Strings_Algorithms_C-:用C++编写的字符串算法
Python代码实现:
``` python
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if not s:
return 0
left, right = 0, 0
window = set()
max_len = 0
while right < len(s):
if s[right] not in window:
window.add(s[right])
right += 1
max_len = max(max_len, len(window))
else:
window.remove(s[left])
left += 1
return max_len
```
Java代码实现:
``` java
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s == null || s.length() == 0) {
return 0;
}
int left = 0, right = 0, maxLen = 0;
Set<Character> window = new HashSet<>();
while (right < s.length()) {
char c = s.charAt(right);
if (!window.contains(c)) {
window.add(c);
right++;
maxLen = Math.max(maxLen, window.size());
} else {
window.remove(s.charAt(left));
left++;
}
}
return maxLen;
}
}
```
时间复杂度:$O(n)$
空间复杂度:$O(min(m, n))$,其中 $m$ 为字符集大小,$n$ 为字符串长度。在最坏情况下,所有字符都不同,需要用 $O(m)$ 的空间存储窗口中的字符。
阅读全文