3. 无重复字符的最长子串
提示
给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串** **的长度。
内容如下
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。注意 "bca" 和 "cab" 也是正确答案。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
-
0 <= s.length <= 5 * 104 -
s由英文字母、数字、符号和空格组成
解题思路
String 的本质就是 char[], 例如:上面就是
97,98,99,97,98,99,98,98
final length:3
98,98,98,98,98
final length:1
112,119,119,107,101,119
final length:3
112,119,32,107,101,49,49,49,119,32,32,32,32
final length:6
所以本质就是
- 拿到不重复的char的值,放到list中
- 及时用list.size()来更新 maxLenth
- 遇到重复值时重新开始计算
自己写的
package demo.Solution3;
import lombok.extern.slf4j.Slf4j;
import java.util.*;
@Slf4j
public class Test3 {
public static void main(String[] args) {
String s = "abcabcbb";
calcLongestStringLength(s);
s = "bbbbb";
calcLongestStringLength(s);
s = "pwwkew";
calcLongestStringLength(s);
s = "pw ke111w ";
calcLongestStringLength(s);
}
private static void calcLongestStringLength(String s) {
// 使用双指针进行选中和更新
int left = 0;
int right = 0;
int maxLen = 0;
char[] chars = s.toCharArray();
printStringCharArray(s);
// 输出char[]
List<Character> list = new ArrayList<>();
List<Character> maxList = new ArrayList<>();
list.add(chars[right]);
for (int i = 0; i < chars.length; i++) {
char next = chars[right++];
// 用左指针去获取数据
if (list.contains(next)) {
maxLen = Math.max(maxLen, list.size());
if (maxLen > maxList.size()) {
maxList = list;
}
list.clear();
// 重新来呗
}
list.add(next);
}
//System.out.println("max list :" + maxList.toString());
System.out.println("final length:" + maxLen);
}
private static void printStringCharArray(String s) {
// 字符串的每一个字符都是char[]
char[] sChars = s.toCharArray();
List<String> list = new ArrayList<>();
for (char c : sChars) {
int value = c;
list.add(String.valueOf(value));
}
String result = String.join(",", list);
System.out.println(result);
}
}