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就会报越界的错误
浙公网安备 33010602011771号