1,问题描述
3. 无重复字符的最长子串
难度:中等
给定一个字符串 s
,请你找出其中不含有重复字符的 最长 子串 的长度。
示例 1:
1 2 3
| 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
|
示例 2:
1 2 3
| 输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
|
示例 3:
1 2 3 4
| 输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
|
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
2,初步思考
本质就是一个双滑动窗口问题
双指针的左滑动、右滑动
3,代码处理
我的题解代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| public int lengthOfLongestSubstring(String s) { int max = 0; int maxIndex = 0; HashSet<Character> set = new HashSet<>(); for (int i = 0; i < s.length(); i++) { for (int j = maxIndex; j < s.length(); j++) { char c = s.charAt(j); if (!set.contains(c)) { set.add(c); max = Math.max(max, set.size()); } else { maxIndex = j; break; } } set.remove(s.charAt(i)); } return max; }
public int lengthOfLongestSubstring_1(String s) { int max = 0;
int indexRight = 0; HashMap<Character, Integer> map = new HashMap<>(); for (int i = 0; i < s.length(); i++) { if(s.length()-i<=max){ break; } for (int j = indexRight; j < s.length(); j++) { indexRight = j+1; char c = s.charAt(j); if (!map.containsKey(c)) { max = Math.max(max, j - i + 1); map.put(c, j); } else { Integer iNew = map.get(c); for (int k = i; k <= iNew; k++) { map.remove(s.charAt(k)); } map.put(c, j); i = iNew; break; } } } return max; }
|
官方的题解代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public int lengthOfLongestSubstring(String s) { Set<Character> occ = new HashSet<Character>(); int n = s.length(); 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; } ans = Math.max(ans, rk - i + 1); } return ans; } }
|
4,思考
感觉就是双指针滑动窗口问题,没什么难度