java给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度
时间: 2023-11-23 12:07:35 浏览: 121
可以使用滑动窗口的方法来解决这个问题。具体来说,我们使用两个指针表示字符串中的某个子串(的左右边界)。其中左指针代表着上文中「枚举子串的起始位置」,而右指针即为上文中的 rrk。
在每一步的操作中,我们会将左指针向右移动一格,表示我们开始枚举下一个字符作为起始位置,然后我们可以不断地向右移动右指针,但需要保证这两个指针对应的子串中没有重复的字符。在移动结束后,这个子串就对应着以左指针开始的,不包含重复字符的最长子串。我们记录下这个子串的长度;在枚举结束后,我们找到的最长的子串的长度即为答案。
时间复杂度:O(n),其中 n 是字符串的长度。左指针和右指针分别会遍历整个字符串一次。
代码如下:
```java
public int lengthOfLongestSubstring(String s) {
int n = s.length();
Set<Character> set = new HashSet<>();
int ans = 0, i = 0, j = 0;
while (i < n && j < n) {
if (!set.contains(s.charAt(j))) {
set.add(s.charAt(j++));
ans = Math.max(ans, j - i);
} else {
set.remove(s.charAt(i++));
}
}
return ans;
}
```
相关问题
给定一个字符串 s ,找出其中不含有重复字符的最长子串的长度代码
在编程中,我们通常使用滑动窗口或者双指针的方法来解决这个问题,这里我会给你一个简洁的Python代码示例:
```python
def lengthOfLongestSubstring(s):
if not s:
return 0
seen = {}
start = maxLength = 0
for end in range(len(s)):
# 如果当前字符已经在seen中并且start还没超过那个位置,说明有重复字符
if s[end] in seen and start <= seen[s[end]]:
start = seen[s[end]] + 1
else:
maxLength = max(maxLength, end - start + 1) # 更新最大长度
seen[s[end]] = end # 把当前字符及其索引添加到字典中
return maxLength
```
这个函数的工作原理是遍历字符串s,维护一个窗口(通过end指针),并在窗口内检查是否有重复字符。如果发现重复,就移动起始点(start)到重复字符之后的第一个未见过的字符处。这样可以保证在任何时候,窗口内的字符都是唯一的。
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度
你的问题可以通过使用滑动窗口算法来解决。具体实现如下:
1. 定义一个字典来存储字符和它们在字符串中的最近一次出现的索引。
2. 定义两个指针 left 和 right,分别指向子串的左右边界。
3. 当右指针指向的字符在字典中已经存在时,更新左指针的位置为该字符在字典中的最近一次出现的索引加1。
4. 在遍历过程中,记录每个不重复子串的最大长度,并返回该长度。
以下是实现代码:
```
def lengthOfLongestSubstring(s: str) -> int:
char_dict = {} # 存储每个字符及其最近一次出现的索引
left = 0 # 左指针,子串左边界
max_len = 0 # 不重复子串的最大长度
for i, char in enumerate(s):
if char in char_dict and char_dict[char] >= left:
left = char_dict[char] + 1
char_dict[char] = i
max_len = max(max_len, i - left + 1)
return max_len
```
你可以使用该函数进行测试:
```
s = "abcabcbb"
print(lengthOfLongestSubstring(s)) # 输出3,对应的不重复子串为"abc"
s = "bbbbb"
print(lengthOfLongestSubstring(s)) # 输出1,对应的不重复子串为"b"
s = "pwwkew"
print(lengthOfLongestSubstring(s)) # 输出3,对应的不重复子串为"wke"
s = ""
print(lengthOfLongestSubstring(s)) # 输出0,空字符串不存在不重复子串
s = " "
print(lengthOfLongestSubstrng(s)) # 输出1,空格""为不重复子串
```
阅读全文