无重复字符的最长子串
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 39 ms, 内存: 16.2 MB
/*
* 思路:使用Java Stream API来简化代码
* 我们将字符串转化为字符流,并使用distinct()方法过滤重复字符
* 然后使用滑动窗口的思想,找到最长无重复字符的子串长度
*/
import java.util.*;
import java.util.stream.IntStream;
public class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> map = new HashMap<>();
return IntStream.range(0, s.length())
.map(i -> {
map.put(s.charAt(i), i);
return map.size();
})
.reduce(0, (max, cur) -> Math.max(max, cur));
}
}
解释
方法:
题解采用的是滑动窗口技术来找出不含有重复字符的最长子串。维护两个指针(begin和end)作为窗口的边界,以及一个哈希表tt来记录每个字符最近一次出现的位置。随着end指针的遍历,如果当前字符s[end]未出现过或者其上一次出现的位置在窗口左边界begin之前,那么更新该字符的位置并计算当前窗口的长度。如果发现重复字符,即s[end]出现的位置在begin之后或等于begin,则更新begin到该字符上次出现位置的下一个位置,重新定义窗口的左边界。这样,每步都可能更新最长子串的长度。
时间复杂度:
O(n)
空间复杂度:
O(m)
代码细节讲解
🦆
滑动窗口中,当遇到重复字符时,为什么将begin指针更新到重复字符的下一个位置而不是其他位置?
▷🦆
在哈希表tt中,你是如何决定何时更新字符的索引位置?
▷🦆
如果字符串包含除英文字母、数字、符号和空格以外的字符,你的算法需要做哪些调整?
▷