Leetcode Longest Substring Without Repeating Characters

     对于这道题目我最开始的想法是用一个list来保存字符串中的元素,先遍历字符串中的字符,若该字符没有在list中则将该字符添加到list中,若有重复的字符则将该list清空。但没有考虑到一个问题,此时遍历的索引应该回到第一次出现重复字符的下一个字符处,好了问题来了,list中无法找到该字符的索引信息

    那么我又想到第二个方法,用hashmap来保存字符串中字符的值及其相应位置,然后用相应的思想,代码如下:

   

HashMap<Character,Integer> map = new HashMap<Character,Integer>();

        int maxlen = 0;
        for (int i = 0; i < s.length(); i++) {
            int k=i+1;
            if (map.containsKey(s.charAt(i))) {
                if (maxlen < map.size()) {
                    maxlen = map.size();
                }
                i=map.get(s.charAt(i));
                map.clear();
            } else
                map.put(s.charAt(i), i);
        }
        int listLen = map.size();
        if (maxlen > listLen)
            return maxlen;
        else
            return listLen;

测试无误后进行提交,发现有时间限制,因此需要换另外一种方法

用HashSet容器来维护一个窗口,首先遍历字符串,将没有重复的字符丢到HashSet中,平时用两个指针,runner指针用来维护当前遍历的元素,walker指针用来表示出现重复字符的第一个字符的下一个。

 1 HashSet<Character> set = new HashSet<Character>();
 2         int walker = 0;
 3         int runner = 0;
 4         int max = 0;
 5         while (runner < s.length()) {
 6             if (set.contains(s.charAt(runner))) {
 7                 if (max < runner - walker) {
 8                     max = runner - walker;
 9                 }
10                 while (s.charAt(walker) != s.charAt(runner)) {
11                     if(set.contains(s.charAt(walker)))
12                     {
13                         set.remove(s.charAt(walker));
14                     }
15                     walker++;
16                 }
17                 walker++;
18             } else {
19                 set.add(s.charAt(runner));
20             }
21             runner++;
22         }
23                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   max = Math.max(max, runner - walker);
24         return max;

但有一个问题,不知道为什么把hashset换成list就会报越界的错误

posted on 2014-11-03 17:08  Chris兔的小佳佳  阅读(143)  评论(0)    收藏  举报