1. 程式人生 > >Leetcode 3 Longest Substring Without Repeating Characters

Leetcode 3 Longest Substring Without Repeating Characters

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.

想了很久沒想出來,借鑑了一點題解:

本題類似於最長公共子序列的問題,動規的思想

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

另一個解:

public class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length(), ans = 0;
        int[] index = new int[128]; // current index of character
        // try to extend the range [i, j]
        for (int j = 0, i = 0; j < n; j++) {
            i = Math.max(index[s.charAt(j)], i);
            ans = Math.max(ans, j - i + 1);
            index[s.charAt(j)] = j + 1;
        }
        return ans;
    }
}
  • int [26] 用於字母 ‘a’ - ‘z’或 ‘A’ - ‘Z’
  • int [128] 用於ASCII碼
  • int [256] 用於擴充套件ASCII碼

時間複雜度為:O(n)

空間複雜度為:O(n)