码迷,mamicode.com
首页 > 其他好文 > 详细

3. Longest Substring Without Repeating Characters寻找不重复的最大子串

时间:2017-12-31 22:30:09      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:一个   sub   结果   nta   break   很多   更新   substring   指针   

首先弄清楚Substring和Subsequence,前者是子串,要求连续,后者是子序列,可以不连续

public int lengthOfLongestSubstring(String s) {
        /*
        一开始自己想的方法:两个指针,一个作为开始,一个用来遍历,复杂度O(N)
         */
        int l = s.length();
        if (l==0)
            return 0;
        char[] str = s.toCharArray();
        int res = 1;
        Set<Character> set = new HashSet<>();
        for (int i = 0; i < l-1; i++) {
            set.add(str[i]);
            for (int j = i+1; j < l; j++) {
                if (set.contains(str[j]))
                    break;
                set.add(str[j]);
                res = Math.max(res,set.size());
            }
            set.clear();
        }
        return res;
    }
    public int lengthOfLongestSubstring2(String s) {
        /*
        O(N)做法,自己建立哈希表来记录有没有出现过,第一次接触这种做法,要记住
        思路就是用哈希表记录当前字符最近一次出现时的index
        如果没出现重复字符串就继续遍历,每次更新res长度
        如果出现了重复,那就把最左边的坐标移到前边重复数字的下一个,然后继续遍历,res一直是记录最大长度
        与这种做法相比,第一种做法每次都会遍历很多重复的子串
         */
        //所有字符都能转化为256以内的int值,这样就可以记录所有字符
        int[] index = new int[256];
        Arrays.fill(index,-1);
        //记录 最左边坐标
        int left = 0;
        //记录结果
        int res = 0;
        for (int i = 0; i < s.length(); i++) {
            //先检测有没有重复字符,如果,left更新,比较的方法是把哈希表中的记录和left比较,取大的。如果没有出现过,那么哈希表中的记录是-1,肯定是left大
            //如果出现过,有两种情况,一种是记录没有left大,说明是和left 之前的一个重复了,这种情况没有影响 ,另一种是比left大,这样就会影响长度的判断,要更新left
            left = Math.max(left,index[s.charAt(i)+1]);
            //更新哈希表
            index[s.charAt(i)] = i;
            res = Math.max(res,i-left+1);
        }
        return res;
    }

 

3. Longest Substring Without Repeating Characters寻找不重复的最大子串

标签:一个   sub   结果   nta   break   很多   更新   substring   指针   

原文地址:https://www.cnblogs.com/stAr-1/p/8158977.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!