zoukankan      html  css  js  c++  java
  • [LeetCode]3.无重复字符的最长子串

    自己的解法

    将字符串转化为字符数组,从首字符向后扫描字串,找到不重复的最长字串

    class Solution {
        public int lengthOfLongestSubstring(String s) {
            char[] chars = s.toCharArray();
            HashSet<Character> hs = new HashSet();
            int size = 0;
            for(int j = 0; j < chars.length; j++){
                for(int i = j; i < chars.length; i++){
                    if(hs.contains(chars[i])){
                            break;
                    }
                    hs.add(chars[i]);
                }
                if(size < hs.size()){
                    size = hs.size();
                }
                hs.clear();
            }
            return size;
        }
    }
    

    滑动窗口

    class Solution {
        public int lengthOfLongestSubstring(String s) {
            HashSet<Character> hs = new HashSet<>();
            int i = 0, j= 0;
            int n = s.length();
            int ans = 0;
            while( i < n && j < n){
                if(!hs.contains(s.charAt(j))){
                    hs.add(s.charAt(j++));
                    ans = Math.max(ans, j - i);
                }
                else{
                    hs.remove(s.charAt(i++));
                }
            }
            return ans;
        }
    }
    

    优化滑动窗口

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

    假设字符集为 ASCII 128

    class Solution {
        public int lengthOfLongestSubstring(String s) {
            int[] index = new int[128];
            int n = s.length();
            int ans = 0;
            for(int i=0, j = 0; j < n; j++){
                i = Math.max(index[s.charAt(j)],i);
                ans = Math.max(ans,j-i+1);
                index[s.charAt(j)] = j+1;
            }
            return ans;
        }
    }
    
  • 相关阅读:
    学习之路五:再议自定义时钟类(跨线程间的访问操作) → 异步操作
    学习之路七:一步一步学习ASP.NET数据绑定
    走进单元测试五:单元测试文章系列目录
    迷茫后的感悟
    学习之路八:解决不能调试服务端代码的问题
    asp.net not found
    java内部类
    DEBUG&TRACE
    Lambda表达式
    基于事件的异步模式
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13860111.html
Copyright © 2011-2022 走看看