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;
        }
    }
    
  • 相关阅读:
    abstract修饰方法总结
    linux tar.gz zip 解压缩 压缩命令
    html5视频播放
    Response.Redirect 打开新窗体的两种方法
    Gmail POP3设置
    加壳学习笔记(二)-汇编基础
    C#-异常处理:tyr,catch,finally ---ShinePans
    cocos2d jsb 打包 Android APK
    编写你自己的单点登录(SSO)服务
    一分钟制作U盘版BT3
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13860111.html
Copyright © 2011-2022 走看看