赫敏小姐,请不要在厕所调制药水。
想起国王十字火车站,你感受到了决心!
问题描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是"wke",所以其
长度为 3。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
一、暴力解法
思路及算法:
复杂度分析:
找到所有子串 O(n^2)
判断子串是否仅含有唯一字符:双指针 O(n^2),HashSet O(n)
整体复杂度最少 O(n^3)
二、滑动窗口及优化
思路及算法:
关键字:重复字符——>出现1次
模式识别1:一旦涉及出现次数,需要用到散列表
关键词:构造子串,散列表存下标
模式识别2:涉及子串,考虑滑动窗口
滑动窗口:
代码:
class Solution {public int lengthOfLongestSubstring(String s) {// 哈希集合,记录每个字符是否出现过HashSet<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;}}
此外,LeetCode大神使用的HashMap数据结构的解法也很强:
class Solution {public int lengthOfLongestSubstring(String s) {if (s.length()==0) return 0;HashMap<Character, Integer> map = new HashMap<Character, Integer>();int max = 0;int left = 0;for(int i = 0; i < s.length(); i ++){if(map.containsKey(s.charAt(i))){left = Math.max(left,map.get(s.charAt(i)) + 1);}map.put(s.charAt(i),i);max = Math.max(max,i-left+1);}return max;}}// 作者:powcai// 链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/hua-dong-chuang-kou-by-powcai/// 来源:力扣(LeetCode)// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
复杂度分析:
文章转载自半猫Coder,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




