leetcode刷题之无重复的最长子串

题目要求:

        给定一个字符串,找出不含有重复字符的 最长子串 的长度。

示例:

给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。

给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。

给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串"pwke" 是 子序列 而不是子串。

思路:

    我看见这道题目的第一感觉,就是从头遍历过来,将之前遍历的一小段没有重复字符的字符串存起来,如果出现新的字符串,就开辟一个新的字符串,进入下一不重复字符的字符串存储。

    乍一看好像思路不错没有什么遗漏。但是自信想象就会发现,如果我在遇到新的字符串的时候,就要开始在容器中新建一个字符的话,最后得到的不重复字符串肯定不对。比如abad,按照我刚才的思路会得到ab,ad两个字符串。但是正确的答案应该得到ab,bad!所以我需要做另外的处理来解决这个问题。

    我选择的解决方案是在遍历的过程中遇到新的字符串的时候,新建一个StringBuffer对象(因为避免内存问题,所以选择的StringBuffer或StringBuilder)。同时会将list中当前的StringBuffer对象取出来,截取与当前遍历的字符相同的字符之后的所有字符,拼接到新建的StrngBuffer中。

    如果就可以获得各个没有重复字符串的 字符串StringBuffer的list集合。之后再排序选取最长字符串的即可获得结果。

    如下是鄙人写的代码:

    public static int lengthOfLongestSubstring(String s) {
        if(s == null || s.length()==0)
            return 0;
        List list = new ArrayList();
        list.add(new StringBuffer());
        int index = 0;
        for(int i = 0;i nums = new ArrayList(list.size());
        for(int i = 0 ; i

    下面是大神写的代码:

    public static int lengthOfLongestSubstring2(String s) {
        int[] list = new int[256]; // 初始化asc码数的字符数值,都默认为 -1
        int previous = -1, right = 0, max_len = 0;
        for(int i=0;i-1(出现过的字符的值为对应right值,即第几个)
        //同时precious也一直保持着最近出现的 重复字符的上此次出现的 坐标
        //因此,每次出现重复字符,并且重复字符的坐标在previous之后的,这可以表示为在之后出现了重复字符串,
        // 同时记录该字符串起始位置 previous = list[(int)c] (该字符串结束位置为list[(int)c] = right++)
        //Math.max(max_len, right - previous) 一直保持着最长字符串的长度
        while(right previous)
                previous = list[(int)c];
            max_len = Math.max(max_len, right - previous);
            list[(int)c] = right++;
        }
        return max_len;
    }
可见大神代码多么简介,并且少了很多不必要的过程。

若有不足,还望指正,大家一起学习,共勉!


你可能感兴趣的:(java语言,leetcode,算法,刷题)