对于这道题目我最开始的想法是用一个list来保存字符串中的元素,先遍历字符串中的字符,若该字符没有在list中则将该字符添加到list中,若有重复的字符则将该list清空。但没有考虑到一个问题,此时遍历的索引应该回到第一次出现重复字符的下一个字符处,好了问题来了,list中无法找到该字符的索引信息。
那么我又想到第二个方法,用hashmap来保存字符串中字符的值及其相应位置,然后用相应的思想,代码如下:
HashMapmap = new HashMap (); 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 HashSetset = new HashSet (); 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就会报越界的错误