LeetCode系列(九)-Longest Substring Without Repeating Characters

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

示例:

  输入: "abcabcbb"
  输出: 3
  解释: 无重复字符的最长子串是 "abc",其长度为 3。

解法:

1.利用队列先进先出的特性。重复的元素弹出。最后算队列的长度就是字符串最大长度。

    public int lengthOfLongestSubstring(String s) {
        char[] chars = s.toCharArray();
        LinkedList<Character> list = new LinkedList<>();
        int max = 0;
        for (int i=0;i<chars.length;i++) {
            // 如果有重复的元素,则当前队列的长度与max比较。
            // 再将重复元素即重复元素前的元素都出列
            if (list.contains(Character.valueOf(chars[i]))) {
                max = Math.max(max, list.size());while(list.contains(Character.valueOf(chars[i]))) {
                    list.removeFirst();
                }
            }
            // 将不重复的元素入列
            if (!list.contains(Character.valueOf(chars[i]))) {
                list.add(chars[i]);
            }
        }
        max = Math.max(max, list.size());return max;
    }

2.都存入Map或者Set集合中,用一个数字当索引表示最后重复数字的位置。并遍历每一位到前面的最大长度。

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

 

posted @ 2018-09-12 10:23  天才小彩笔i  阅读(103)  评论(0编辑  收藏  举报