3. 无重复字符的最长子串
滑动窗口
class Solution {
public int lengthOfLongestSubstring(String s) {
/**
* 滑动窗口
* 哈希表存储字符的个数,如果大于0说明重复了
*/
int[] count = new int[256];
int left = 0;
int right = 0;
int max = 0;
while (right < s.length()){
if (count[s.charAt(right)] == 0){
count[s.charAt(right)]++;
right++;
}
else {
/**
* 个数大于0说明重复了,left左移一位
*/
count[s.charAt(left)]--;
left++;
max = Math.max(max, right - left + 1);
}
}
return max;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
可变字符串
class Solution {
public int lengthOfLongestSubstring(String s) {
/**
* 使用可变字符串StringBuilder方便对子串进行增删
*/
StringBuilder str = new StringBuilder();
int right = 0;
int max = 0;
while (right < s.length()){
/**
* 不包含这个字符就加上
* String.valueOf()将字符转换为字符串
*/
if (str.indexOf(String.valueOf(s.charAt(right))) < 0){
str.append(s.charAt(right));
max = Math.max(str.length(), max);
right++;
}
/**
* 如果出现了重复元素,删除子串的第一个字符再去判断
*/
else {
str.deleteCharAt(0);
}
}
return max;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
优化1——减少排重的次数
class Solution {
public int lengthOfLongestSubstring(String s) {
StringBuilder str = new StringBuilder();
int right = 0;
int max = 0;
while (right < s.length()){
int flag = str.indexOf(String.valueOf(s.charAt(right)));
if (flag < 0){
str.append(s.charAt(right));
max = Math.max(str.length(), max);
right++;
}
/**
* 如果出现了重复元素,用flag记录下重复元素第一次出现的位置,该位置之前的区间都不符合条件了,全部删掉
*/
else {
str.delete(0, flag + 1);
}
}
return max;
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/