zoukankan      html  css  js  c++  java
  • LeetCode0003 无重复字符的最长子串

    1 问题描述

    判断字符串中某个最长子串的长度,这个子串中不含有重复字符。

    2 错误解法

    class Solution {
        public int lengthOfLongestSubstring(String s) {
            char[] stringArr = s.toCharArray();
    
            Map<Character, Integer> hashMap = new HashMap<>();
            int maxLen = 0, t = 0;
            
            if (stringArr.length == 0) {
                return maxLen;
            }else {
                hashMap.put(stringArr[0], 0);
                maxLen = 1;
                t = maxLen;
            }
    
            for (int i = 1; i < stringArr.length; i++){
                if (!hashMap.containsKey(stringArr[i])) {
                    hashMap.put(stringArr[i], i);
                    maxLen++;
                    if (maxLen > t) {
                        t = maxLen;
                    }
                }else {
                    if (maxLen > t) {
                        t = maxLen;
                    }
                    maxLen = 0;
                    hashMap.clear();
                    hashMap.put(stringArr[i], i);
                    maxLen++;
                }
            }
    
            return t;
        }
    }

    错误原因:没有考虑多种情况。

     3 错误解法二

    class Solution {
        public int lengthOfLongestSubstring(String s) {
           // 暴力解法,求出s的所有子串,再逐一判断是否满足要求
           int maxLen = 0, t = 0;
           String subString;
           char[] subStringArr;
    
           for (int i = 0; i < s.length(); i++) {
               for (int j = i + 1; j <= s.length(); j++) {
                   // 双重循环,获取每一个可能的子串
                   subString = s.substring(i, j);
                   subStringArr = subString.toCharArray();
                   // 判断该子串是否包含重复字符(方法一)
                   maxLen = subStringArr.length;
                   for (char c : subStringArr) {
                       if (subString.indexOf(c) != subString.lastIndexOf(c)) {
                           maxLen = 0;
                           break;
                       }
                   }
                //    判断该子串是否包含重复子串(方法二 HashSet)
                //    Set<Character> hashSet = new HashSet<>();
                //    for (char c : subStringArr) {
                //        hashSet.add(c);
                //    }
                //    if (hashSet.size() == subStringArr.length) {
                //        maxLen = subStringArr.length;
                //    }else {
                //        continue;
                //    }
                   // 如果该子串不包含重复字符,则比较该子串与当前最长子串,哪个更长
                   if (maxLen > t) {
                       t = maxLen;
                   }
               }
           }
    
           return t;
        }
    }

     暴力解法的思路可行,但实际运行不一定可行。最后一个测试用例3W+字符,超出了时间限制。

    4 正确解法:平滑窗口

    class Solution {
        public int lengthOfLongestSubstring(String s) {
            // 滑动窗口
            int rk = -1, ans = 0;
            int n = s.length();
            Set<Character> hashSet = new HashSet<>();
            
            for (int i = 0; i < n; ++i) {
                if (i != 0) {
                    hashSet.remove(s.charAt(i - 1));  // 每次遍历去掉集合中第一个元素
                }
                while (rk + 1 < n && !hashSet.contains(s.charAt(rk + 1))) {
                    hashSet.add(s.charAt(rk + 1));
                    ++rk;
                }
                ans = Math.max(ans, rk - i + 1);
            }
            return ans;
        }
    }

     

  • 相关阅读:
    webpack—从零开始配置
    多媒体标签 API(video、audio)
    node 爬虫
    node 操作数据库
    es6+
    UI 组件库 引入使用的问题
    单页应用存在 的问题
    ajax 封装(集中 认证、错误、请求loading处理)
    moment.js 时间库
    文件上传大小被限制的解决方案。
  • 原文地址:https://www.cnblogs.com/wangmengdx/p/15149984.html
Copyright © 2011-2022 走看看