美文网首页
无重复字符的最长子串

无重复字符的最长子串

作者: 我可能是个假开发 | 来源:发表于2023-04-30 22:45 被阅读0次

    一、题目

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

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

    示例 2:

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

    示例 3:

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

    提示:
    0 <= s.length <= 5 * 104
    s 由英文字母、数字、符号和空格组成

    二、解答

    1.暴力破解

    两个for循环把所有子串存入集合,最后找出所有子串中最大值。

    class Solution {
        public int lengthOfLongestSubstring(String s) {
            if(s.length()==0){
                return 0;
            }
            char ss[] = s.toCharArray();
            List<String> list = new ArrayList();
            Set<String> set = new HashSet();
            List<Integer> subList = new ArrayList();
            
            for (int i = 0; i < ss.length; i++) {
                outer:
                for(int j = i;j<ss.length;j++){
                    list.add(String.valueOf(ss[j]));
                    set.add(String.valueOf(ss[j]));
                    if(list.size()>set.size()){
                        subList.add(list.size()-1);
                        list.clear();
                        set.clear();
                        break outer;
                    }
                }
            }
            if(subList.size()==0){
                return 1;
            }
            
            int max = subList.get(0);
            for(int k = 0;k<subList.size();k++){
                int cur = subList.get(k);
                if(max<cur){
                    max = cur;
                }
            }
            return max;
        }
    }
    

    2.滑动窗口

    两个变量

    • length:当前窗口的长度
    • maxLength:窗口的最大长度

    存储窗口元素的集合(元素不可重复):Set

    两个指针

    • left:左指针
    • right:右指针
      左右指针同时从下标0开始,右指针一直往右移动,每次移动到的元素存入窗口元素集合,记录当前长度和最大长度,如果当前长度比最大长度大,则更新最大长度;当遇到当前元素与窗口集合中的元素相同时,移动左指针,同时更新窗口的元素集合(窗口存储的是左右指针之间的元素),直到右指针的元素可以放入窗口集合则左指针停下来,继续移动右指针;如此反复,直到右指针遍历完所有元素,移动过程中记录的最大长度就是最长子串。


      最长子串.jpeg
    class Solution {
        public int lengthOfLongestSubstring(String s) {
            if(s.length()==0){
                return 0;
            }
            int length = 0;
            int maxLength = 0;
            int right = 0;
            int left = 0;
            Set<String> set = new HashSet<String>();
            char[] chars = s.toCharArray();
            while (right<chars.length){
                String rightEle = String.valueOf(chars[right]);
                if(!set.contains(rightEle)){
                    //集合中没有当前元素
                    set.add(rightEle);
                    //移动右指针
                    right++;
                }else{
                    String leftEle = String.valueOf(chars[left]);
                    //集合中有当前元素 移动左指针
                    set.remove(leftEle);
                    left++;
                }
                length = set.size();
                if(maxLength<length){
                    maxLength = length;
                }
            }
            return maxLength;
        }
    }
    

    相关文章

      网友评论

          本文标题:无重复字符的最长子串

          本文链接:https://www.haomeiwen.com/subject/hmmnjdtx.html