Longest Substring Without Repeating Characters
LeetCode算法第3题
思路:
1、字符串或数组的子串问题,可以用两个索引区间来表示。长度即为:j - i + 1
2、题目要求无重复,时间复杂度低的查找可以想到哈希查找,通过使用HashSet来检查字符是否重复的时间复杂度为O(1)
流程:
①创建一个HashSet来保存当前字符串的字符
② i 和 j 两个索引表示当前子串,从0、0开始, i 和 j 表示的都是第一个字符
③把索引 j 逐个向右扫描,并检查索引 j 位置的字符是否在set中
④如果索引 j 位置的字符不在set中,则将索引 j 位置的字符加入set
⑤查看并比较当前子串长度
⑥继续将 j 索引向右
⑦如果索引 j 位置的字符在set中,则将索引 i 位置的字符移出set
⑧并将索引 i 向右移动(如果索引 j 位置的字符仍然在set中,则继续执行⑦⑧)
public class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length();
Set<Character> set = new HashSet<>();//<1>
int ans = 0, i = 0, j = 0;//<2>
while (i < n && j < n) {
if (!set.contains(s.charAt(j))) {//<3>
set.add(s.charAt(j));//<4>
ans = Math.max(ans, j - i + 1);//<5>
j++;//<6>
} else {
set.remove(s.charAt(i));//<7>
i++;//<8>
}
}
return ans;
}
}
时间复杂度,最多进行两个循环,把i循环到n,把j循环到n,所以为O(2n),即为O(n)
空间复杂度取决于要查找的字符,set要能装下所有不同的字符
网友评论