LeetCode從零刷起 (3. Longest Substring Without Repeating Characters Add to List)

最近好久沒有更新博客了,因為博主最近忙于學校的一些學業(yè)工作。大三下學期嘛,還是挺忙的-,-。
下面我們來看一下這道題:

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.

題目簡介

這道題輸入是一個字符串s,然后讓我們返回最長不重復子串的長度。

知識要點:

1.ASCⅡ字符一共有128個,一般情況下,計算機最多只能表示128個不同的character。
2.Sliding window的思想。

解題思路:

首先我們很容易想到用一個128位的數(shù)組來存儲子串中是否出現(xiàn)過了某個字符,我們用一個布爾型數(shù)組表示:<code>bool used[128];</code>
接下來就是對子串的尋找過程了,首先是暴力算法:

Approach 1: Brute Force

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        bool isIn[128];
        int i, j, max = 0, tmp;
        string sub;
        for (i=0; i<s.length(); ++i){
            for (int k=0; k<128; ++k)
                isIn[k] = false;
            for (j=i; j<s.length(); ++j){
                if (isIn[int(s[j])] == false){
                    isIn[int(s[j])] = true;
                    tmp = j-i+1;
                    if (tmp > max)
                        max = tmp;
                }
                else
                    break;
            }
        }
        return max;
    }
};

時間復雜度: O(n^2)。
brute force是一種最容易想到的na?ve algorithm了,但是根據(jù)我們的做題經驗(-,-),這題肯定還有更優(yōu)化的算法,于是我們想到了sliding window的思想:

Aproach 2: Sliding Window

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int i=0, j=0, max = 0, n = s.length();
        bool used[128] = {0};
        while (i < n && j < n){
            if (used[int(s[j])] == 0){
                used[int(s[j++])] = true;
                max = (j-i) > max? (j-i):max;
            }
            else
                used[int(s[i++])] = false;
        }
        return max;
    }
};

時間復雜度: O(2n) = O(n)
Sliding Window(滑動窗口)的思想:

設置一個窗口左邊界和一個窗口右邊界。
重復下列過程直到字符串末尾{
符合條件時,窗口右邊界移動擴增;
不符合條件時:窗口左邊界移動內縮。
}

在執(zhí)行該算法的同時,注意改變<code>used[]</code>數(shù)組的元素值從而記錄當前子串是否存在某一character。同時注意更新最長長度max。最后返回max即可。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容