中等题目
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2: 输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3: 输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示: 0 <= s.length <= 5 * 10^4 s 由英文字母、数字、符号和空格组成
|
最开始解法
初步判断为滑动窗口,记录最长字串和最长长度,然后不断右移和缩动窗口
技术栈:
字符串分割 String.substring(prev, last)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public int lengthOfLongestSubstring(String s) { String subs = ""; int ans = 0; for (int i=0;i<s.length();i++) { char c = s.charAt(i); int findIndex = subs.indexOf(String.valueOf(c)); if (findIndex == -1) { subs += c; ans = Math.max(ans, subs.length()); } else { ans = Math.max(ans, subs.length()); subs = subs.substring(findIndex + 1, subs.length()) + c; } } return ans; } }
|
时间 12ms
使用滑动窗口框架解法
使用hash记录字符出现次数,出现重复字符则滑动
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) { Map<Character, Integer> window = new HashMap<>(); int left = 0, right = 0; int ans = 0;
while (right < s.length()) { char c = s.charAt(right); right++; window.put(c, window.getOrDefault(c, 0) + 1);
while (window.get(c) > 1) { char lc = s.charAt(left); left ++; window.put(lc, window.get(lc) -1); }
ans = Math.max(ans, right - left); }
return ans; } }
|
时间 6ms