题目描述
- 给定一个字符串,找出不含有重复字符的最长子串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 无重复字符的最长子串是 "abc",其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1.
解释: 无重复字符的最长子串是 "b",其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 无重复字符的最长子串是 "wke",其长度为 3。
请注意,答案必须是一个子串,"pwke" 是一个子序列 而不是子串。
难度系数:中等
思路解析
- 暴力破解(时间复杂度O(n^2),在此不举例)
- 分别用两个指针 i,j,通过使用HashSet来检查字符是否重复的时间复杂度为O(1),时间复杂度O(n)。
流程
① 创建一个HashSet来保存当前字符串的字符
② i 和 j 两个索引表示当前子串,从0、0开始, i 和 j 表示的都是第一个字符
③ 把索引 j 逐个向右扫描,并检查索引 j 位置的字符是否在set中
④ 如果索引 j 位置的字符不在set中,则将索引 j 位置的字符加入set
⑤ 查看并比较当前子串长度
⑥ 继续将 j 索引向右
⑦ 如果索引 j 位置的字符在set中,则将索引 i 位置的字符移出set
⑧ 并将索引 i 向右移动(如果索引 j 位置的字符仍然在set中,则继续执行⑦⑧)
- 图片来源:wx公众号@五分钟学算法。
代码
/**
* 无重复字符的最长字串
* @param s
* @return
*/
public int longestString(String s){
/**思路:遍历string每个char[], **/
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 + 1);
j++;
} else {
set.remove(s.charAt(i));
i++;
}
}
return ans;
}