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; }