经典问题,记录一下这道题解法
问题描述
给定一个字符串,找到最长子串的长度,要求子串不含不重复字符。
样例
给定"pwkpwo"的答案是是4("kpwo")。
给定"bbbbb"的答案是1("b")。
解法
1.双指针-滑动窗口
i:表示窗口左端点
j:表示窗口右端点
set存储s[i]到s[j]间的字符
如果没有重复字符,那么将当前窗口大小与目前最长的子串长度比较并更新,j++;
如果有重复字符,那么将窗口左端点右移,i++,直到窗口内不含重复字符,执行上一行
复杂度:
遍历一遍字符串s为O(n),而set里极端情况下也只存128个字符,所以插入删除是O(1)的,总的复杂度就是O(n)
public class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length();
Set set = new HashSet<>();
int ans = 0, i = 0, j = 0;
while (i < n && j < n) {
// try to extend the range [i, j] if (!set.contains(s.charAt(j))){
set.add(s.charAt(j++));