3. 无重复字符的最长子串

    xiaoxiao2022-07-12  143

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

    示例 1:

    输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

    示例 2:

    输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

    示例 3:

    输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。   请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

    解法1:

    思路:循环每个字符,查找以当前字符开头不重复的最长字符串。

    优化的点:1.若当前字符到结束位置的length<=maxResult,则退出循环

                      2.去掉第一个重复的字符之前的字符,组成新的字符串(减少一部分查询)。比如字符串是 “abcca”,查找第一个重复字符是“c”(charAt(3),第二个“c”),则下一个开始字符串从“ca”开始,而不是从“bcca”开始。

    class Solution { public int lengthOfLongestSubstring(String s) { int maxResult = 0; for(int i=0;i<s.length();i++){ String tmpString = s.substring(i); int tmpResult = findMaxLineString(tmpString); if (maxResult<tmpResult){ maxResult = tmpResult; } if (i+maxResult>=s.length()){ break; } for (int j=0;j<tmpResult;j++) { if (tmpString.charAt(j)==tmpString.charAt(tmpResult)){ i = i+j; break; } } } return maxResult; } /** * 获取当前字符串起始位置开始的最长无重复字符串 **/ public int findMaxLineString(String s){ Set<Character> charSet = new HashSet<Character>(); int maxLength = 0; for (int i=0;i<s.length();i++){ if(charSet.contains(s.charAt(i))){ break; } charSet.add(s.charAt(i)); maxLength ++; } return maxLength; } }

     

    解法2:滑动窗口

    自己的理解:用一个框卡住字符串,要求框内字符串满足题目要求,框的长度就是无重复字符串长度。如图

    图1.1 滑动窗口解题图

    实现的方案是用一个left保存当前滑动窗口的左边界,

    class Solution { public int lengthOfLongestSubstring(String s) { HashMap<Character,Integer> hashMap = new HashMap<Character,Integer>(26); int max = 0; int left = 0; for (int i=0;i<s.length();i++) { if (hashMap.containsKey(s.charAt(i))) { left = Math.max(left,hashMap.get(s.charAt(i))+1); } hashMap.put(s.charAt(i),i); max = Math.max(max,i-left+1); } return max; } }

     

    解法一是第一时间想到的,第二种是看了解答后理解的,差距还是蛮大的,学习了

    平时一直使用IDE,习惯了敲出“.”直接出提示,手敲代码问题比较多,记录下问题(标红是出错的点)

    set list 增加用 add

    set list查询是否存在用contains

    map增加用 put

    map查询用containsKey

    string 截取是substring 包含开头,不包含结尾

    string charAt 从0开始

     

    最新回复(0)