3. longest substring

Given a string, find the length of the longest substring without repeating characters.

Examples:

Given "abcabcbb", the answer is "abc", which the length is 3.

Given "bbbbb", the answer is "b", with the length of 1.

Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and not a substring.

我的答案:用一個map維護不重複的substring,每次遇到重複的就移除重複的元素及其之前的元素,重新計算最大長度。

public class Solution {
    public int lengthOfLongestSubstring(String s) {
        if(s.length() <=1) {
            return s.length();
        }
        int length = 0;
        int start = 0;
        Map<Character, Integer> map = new HashMap<>();
        for(int i=0, size = s.length(); i<size; i++) {
            if (!map.containsKey(s.charAt(i))) {
                map.put(s.charAt(i), i);
                if(map.size() == 1) {
                    start = i;
                }
            } else {
                length = Math.max(length, map.size());
                int index = map.get(s.charAt(i));
                for(int j = start; j<= index; j++){
                    map.remove(s.charAt(j));
                }
                start = index+1;
                map.put(s.charAt(i), i);
            }
        }
        return Math.max(length, map.size());
    }
}

11-line simple Java solution, O(n) with explanation

the basic idea is, keep a hashmap which stores the characters in string as keys and their positions as values, and keep two pointers which define the max substring. move the right pointer to scan through the string , and meanwhile update the hashmap. If the character is already in the hashmap, then move the left pointer to the right of the same character last found. Note that the two pointers can only move forward.

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

這個解法性能更高,並沒有移除之前的元素而是通過字符串的index下標來計算最大長度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章