博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
子串 Longest Substring Without Repeating Characters
阅读量:6040 次
发布时间:2019-06-20

本文共 2504 字,大约阅读时间需要 8 分钟。

hot3.png

问题:

Given a string, find the length of the longest substring without repeating characters.

Examples:

Given "abcabcbb", the answer is "abc", which the length is 3.

Given "bbbbb", the answer is "b", with the length of 1.

Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring"pwke" is a subsequence and not a substring

解决:

① 使用map保存当前节点的值和到当前节点位置,共遍历了多少个字符,然后使用一个变量left记录左侧第一个不重复的字符的位置,从而可以计算当前不重复字符的个数(i - left + 1).

class Solution { //65ms

    public int lengthOfLongestSubstring(String s) {
        Map<Character,Integer> map = new HashMap<>();
        int count  = 0;
        int left = 0;
        int right = 0;
        while(right < s.length()) {
            if(! map.containsKey(s.charAt(right)) || map.get(s.charAt(right)) < left){
                count = Math.max(count,right - left + 1);
            }else{
                left = map.get(s.charAt(right));
            }
            map.put(s.charAt(right),right + 1);
            right ++;
        }
        return count;
    }
}

class Solution { //54ms

    public int lengthOfLongestSubstring(String s) {
        Map<Character,Integer> map = new HashMap<>();
        int count  = 0;
        int left = 0;
        for (int i = 0;i < s.length() ;i ++ ) {
            if(! map.containsKey(s.charAt(i)) || map.get(s.charAt(i)) <= left){//第二个条件表示重复字符在左边界外面
                count = Math.max(count,i - left + 1);
            }else{
                left = map.get(s.charAt(i));
            }
            map.put(s.charAt(i),i + 1);
        }
        return count;
    }
}

② 然后我想到了用hash table保存,然后使用一个变量left记录下一个无重复的点。

class Solution { // 41ms

    public int lengthOfLongestSubstring(String s) {
        int[] hash = new int[256];
        int count = 0;
        int left = 0;
        for (int i = 0;i < s.length() ;i ++ ) {
            if(hash[(int)s.charAt(i)] == 0 || hash[(int)s.charAt(i)] <= left){
                count = Math.max(count,i - left + 1);
            }else{
                left = hash[(int)s.charAt(i)];
            }
            hash[(int)s.charAt(i)] = i + 1;
        }  
        return count;
    }
}

③ 进化版

class Solution { //43ms

    public int lengthOfLongestSubstring(String s) {
        int[] hash = new int[256];
        Arrays.fill(hash,-1);
        int count = 0;
        int left = -1;
        for (int i = 0;i < s.length() ;i ++ ) {
            left = Math.max(left,hash[(int)s.charAt(i)]);
            hash[(int)s.charAt(i)] = i;
            count = Math.max(count,i - left);
        }
        return count;
    }
}

④ 使用hashset。把出现过的字符都放入set中,遇到set中没有的字符就加入set中并更新结果count,如果遇到重复的,则从左边开始删字符,直到删到重复的字符停止。

class Solution { //73ms

    public int lengthOfLongestSubstring(String s) {
        int count = 0;
        int left = 0;
        int right = 0;
        Set<Character> set = new HashSet<>();
        while(right < s.length()){
            if(! set.contains(s.charAt(right))){
                set.add(s.charAt(right));
                right ++;
                count = Math.max(count,set.size());
            }else{
                set.remove(s.charAt(left));
                left ++;
            }
        }
        return count;
    }
}

转载于:https://my.oschina.net/liyurong/blog/1522724

你可能感兴趣的文章
点滴记录——Ubuntu 14.04中Solr与Tomcat整合安装
查看>>
C++实现KMP模式匹配算法
查看>>
ubuntu linux下建立stm32开发环境: GCC安装以及工程Makefile建立
查看>>
记录锁
查看>>
JSONObject与JSONArray的使用
查看>>
[SQL Server] 数据库日志文件自动增长导致连接超时的分析
查看>>
<html:form>标签
查看>>
除了《一无所有》,我一无所有
查看>>
每日英语:China Seeks to Calm Anxiety Over Rice
查看>>
C++中struct和class的区别 [转]
查看>>
C++ ofstream和ifstream详细用法
查看>>
Mysql 连接查询 Mysql支持的连接查询有哪些
查看>>
Hive Streaming 追加 ORC 文件
查看>>
打开Apache自带的Web监视器
查看>>
eclipse插件
查看>>
Android笔记:通过RadioGroup/RadioButton自定义tabhost的简单方法
查看>>
ELCSlider
查看>>
XCode工程中 Targets详解
查看>>
Ext.Msg.prompt的高级应用
查看>>
Postgres 中 to_char 格式化记录
查看>>