1. 程式人生 > >LeetCode 演算法學習(2)

LeetCode 演算法學習(2)

題目描述

Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters.
Example 1:

Input: “abcabcbb”
Output: 3
Explanation: The answer is “abc”, with the length of 3.

Example 2:

Input: “bbbbb”
Output: 1
Explanation: The answer is “b”, with the length of 1.

Example 3:

Input: “pwwkew”
Output: 3
Explanation: 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.

題目大意

求最長無重複元素的子串。

思路分析

採用動態規劃的思想,在遍歷到出現重複元素時,轉到該重複元素第一次出現的位置繼續查詢。時間複雜度為O(n),空間複雜度為O(1)。

關鍵程式碼

    int lengthOfLongestSubstring(string s) {
        int n = s.length();
        bitset<256> repeated;
        int i = 0, j = 0;
        int max = 0, temp = 0;
        while(i < n && j < n) {
            if (!repeated.test((int)s[j])) { // 在未出現重複元素時繼續向後遍歷
                repeated.set((int)s[j++]);
                temp = repeated.count();
                max = (max > temp) ? max : temp;
            } else { // 出現重複元素時將從字串的開頭位置到重複元素第一次出現的位置間的元素排除出集合
                repeated.reset((int)s[i++]);
            }
        }
        return max;
    }

總結

這是一道比較經典的動態規劃問題,一邊遍歷一邊尋找,類似的還有KMP演算法匹配字串等,使用類似的思想可以快速的解決一些問題。