leetcode第3题 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew” 输出: 3 解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
1.自己写的
import java.util.List;
public class Test {
public static void main(String[] args) {
String test = "";
int a= lengthOfLongestSubstring(test);
System.out.println(a);
}
public static int lengthOfLongestSubstring(String s) {
char[] c = s.toCharArray();
List<Integer> sum = new ArrayList<>();
// 1. 第一层循环
for (int i = 0; i < c.length; i++) {
List<String> temp = new ArrayList<>();
temp.add(String.valueOf(c[i]));
//2. 第二次循环
for (int j = i + 1; j < c.length; j++) {
if (!temp.contains(String.valueOf(c[j]))) {
temp.add(String.valueOf(c[j]));
} else {
break;
}
}
sum.add(temp.size());
}
//3.找出最大的size
Integer integer=0;
if(sum.size()!=0){
integer = sum.stream().max(Integer::compareTo).get();
System.out.println(sum.toString());
System.out.println("integer---" + integer);
}
return integer;
}
}
2.官方解法
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Test {
public static void main(String[] args) {
String test = "abcabcbb";
int a= lengthOfLongestSubstring(test);
System.out.println(a);
}
public static int lengthOfLongestSubstring(String s) {
// 哈希集合,记录每个字符是否出现过
Set<Character> occ = new HashSet<Character>();
int n = s.length();
// 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
int rk = -1, ans = 0;
for (int i = 0; i < n; ++i) {
if (i != 0) {
// 左指针向右移动一格,移除一个字符
occ.remove(s.charAt(i - 1));
}
while (rk + 1 < n && !occ.contains(s.charAt(rk + 1))) {
// 不断地移动右指针
occ.add(s.charAt(rk + 1));
++rk;
}
// 第 i 到 rk 个字符是一个极长的无重复字符子串
ans = Math.max(ans, rk - i + 1);
}
return ans;
}
}