1. 程式人生 > >LeetCode | Longest Substring Without Repeating Characters(最長連續不重複子串)

LeetCode | Longest Substring Without Repeating Characters(最長連續不重複子串)

題目:

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

找出最長不重複的連續子串。

題目解析:

題意很簡單,就是要找到最長的連續的子串。

思路一:

最先考慮到的就是求第i位字元開頭的,最大的子串長度。沒增加第j位的字元,就要與i -- j-1之間的字元相比較,直到出現重複或者遍歷完為止。這也是最複雜的,需要O(n^2)時間複雜度。中間要設定一個maxlen變數,判斷第i位開始的字元是否超過了最大長度。

思路二:

我們可以從《最大連續子陣列和》得到啟發,我們求第i位字元結尾的最大長度:遍歷到第i位的時候,如果和前面不重複,就max++(這裡為max不是maxlen);如果重複,通過遍歷從i-maxlen到i-1位的字元,與第i位字元相比較,找到相等的位j,那麼maxlen可能會被i-j更新!

然後再遍歷i+1位的字元。。。

這個思路比上面的有一點改進,不過也是需要比較後才能得到,時間複雜度也有一點高。

思路三:

通常我們要降低時間複雜度,可以考慮犧牲空間來獲得。

我們通過hash表,並附設兩個“指標”i和j;用字元的整數值當索引,值為0或1表示是否之前存在。當存在了,就將i++並清零,直到j所表示的字元被清零為止。

比如abcdba,當j等於4的時候,arr[1]是為1的,此時i為0,那麼先將arr[0]和arr[1]清零,然後再對arr[1]賦值為1。

int LengthOfLongestSubstring(char *str)
{
    int i,j;
    int maxlen = 0; //要初始化,不然產生意外結果!
    int n = strlen(str);
    int arr[256] = {0};     //設定hash表,索引為字元的值,值為是否存在該字元!

    for(i = 0,j = 0;j < n;j++){
        while(arr[str[j]] == 1){
            arr[str[i]] = 0;
            ++i;
        }
        arr[str[j]] = 1;
        maxlen = maxlen > (j-i) ? maxlen : j-i+1;
    }

    return maxlen;
}


思路四:

通常我們能想到用雜湊表,但是往往在索引和值表示的概念上造成混亂。一般索引用要判斷字元是否存在的字元值來表示,而值就是我們關心的是否存在,這就得出了思路三。但進一步想想,我們知道了他存在,但還想知道具體位置。

方案一:我們可以再另外附設一個數組,來表示其儲存的位置

用一個start和end來記錄目前考察的字串的開頭和結尾
用exist[26]來記錄目前字串中出現過的字母
用position[26]來記錄出現過的字串的字母的位置

然後我們往後走一位,然後和exist來比較看這個字母是否已經出現過了。

1 如果出現過了,那麼我們把start移動到之前那個字母出現的位置的後一位,end往後移動一位
2 如果沒有出現過,那麼我們就把end往後移動一位

程式碼:

int lengthOfLongestSubstring(string s) 
{
    int max = 0, start = 0;
    bool exist[26];
    int position[26];
    
    for(int i = 0; i < 26; i++) {
        exist[i] = false;
        position[i] = 0;
    }
    
    for(int i = 0; i < s.size(); i++) {
        if(exist[s[i] - 'a']) {
            for(int j = start; j <= position[s[i] - 'a']; j++) {
                exist[s[j] - 'a'] = false;
            }
            start = position[s[i] - 'a'] + 1;
            exist[s[i] - 'a'] = true;
            position[s[i] - 'a'] = i;
        }
        else {
            exist[s[i] - 'a'] = true;
            position[s[i] - 'a'] = i;
            max = max > (i - start + 1) ? max : (i - start + 1);
        }
    }

    return max;
}


方案二:

-----錯誤的做法!!!比如abbbbbba應該輸出2,但是按照這個的話,會輸出7。

我們不僅要儲存位置,還要取 len = min(len+1,j-index); if(len > max) max = len。之所以要取最小值,是因為len的長度要麼大幅度減小,要麼一個一個增加,而j-index可能很大。

我們完全可以讓思路三中的arr[]陣列儲存位置即可!當存在了,就更新其為最新的位置即可。當已經存在了,就將j-index與最大長度相比,看是否更新,並將索引陣列更新為j。

程式碼如下:

int LengthOfLongestSubstring1(char *str)
{
    int idex = -1,j;
    int maxlen = 0; //要初始化,不然產生意外結果!
    int n = strlen(str);
    int arr[256];     //設定hash表,索引為字元的值,值為是否存在該字元!

    memset(arr,-1,256 * sizeof(int));   //設定的是位元組數,因此要乘以sizeof(int)
    for(j = 0;j < n;j++){
        if(arr[str[j]] > -1){
            idex = arr[str[j]];
        }
        arr[str[j]] = j;
        if(j-idex > maxlen)
            maxlen = j-idex;
    }

    return maxlen;
}


正確程式碼:

class Solution {
public:
    int lengthOfLongestSubstring(string s){
        int idex = -1,j;
        int maxlen = 0,len = 0; //要初始化,不然產生意外結果!
        int n = s.size();
        if(n == 0)
            return 0;
        int arr[256];     //設定hash表,索引為字元的值,值為是否存在該字元!
    
        memset(arr,-1,256 * sizeof(int));   //設定的是位元組數,因此要乘以sizeof(int)
        for(j = 0;j < n;j++){
            idex = arr[s[j]];
            arr[s[j]] = j;
            len = len+1 > j-idex ? j-idex : len+1;
            if(len > maxlen)
                maxlen = len;
        }

        return maxlen;
    }
};


相關推薦

LeetCode | Longest Substring Without Repeating Characters連續重複

題目: Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without re

LeetCode千題斬之3:Longest Substring Without Repeating Characters重複

題目:Given a string, find the length of the longest substring without repeating characters. 先說說思路,優化的方法在於用一個滑動的視窗[i,j]瀏覽字串,先把遇到的字元加入一個字典dic

LeetCode-面試演算法經典-Java實現】【003-Longest Substring Without Repeating Characters重複字串

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

Leetcode longest-substring-without-repeating-charactersjava實現

題目描述 第一種解題方法 題目是求最長無重複子字串 1.採用定義一個256位大小的整型陣列來代替HashMap,保證了無重複性,256位長度是因ASCII表共能表示256個字元來記錄所有字元。 2.定義標記無重字串最左邊的位置和最終結果長度的int整型變數,left和res,遍歷整個

LeetCode 3.無重複字元的長子 Longest Substring Without Repeating CharactersC語言

題目描述: 給定一個字串,請你找出其中不含有重複字元的最長子串的長度。 示例 1: 輸入: “abcabcbb” 輸出: 3 解釋: 因為無重複字元的最長子串是 “abc”,所以其長度為 3。 示例 2: 輸入: “bbbbb” 輸出: 1 解釋

[LeetCode] Longest substring without repeating characters 無重復

log 技術 pan -i 一個 html https rep tor Given a string, find the length of the longest substring without repeating characters. For example, t

LeetCode 3. Longest Substring Without Repeating Charactersmedium難度【精】

scrip 有一個 重復 and 指向 是否 最長 ring 最優解 Given a string, find the length of the longest substring without repeating characters. Examples: Give

Given a string, find the length of the longest substring without repeating characters.給定一個字符,找到的長度,這個子存在重復的字符。

長度 index val color arraylist pub 翻譯 buffer int Given a string, find the length of the longest substring without repeating characters.

LeetCode 3-Longest Substring Without Repeating Characters

題目: https://leetcode.com/problems/longest-substring-without-repeating-characters/ 概述 :找給定字串中不重複的最長子集。 思路 : 用map來儲存每個字母最後出現的位置。j來表示不出現重複字母的最後

LeetCode」0003- Longest Substring Without Repeating CharactersC++

分析 貪心思想。注意更新每次判斷的最長不同子串的左區間的時候,它是必須單調增的(有時候會在這裡翻車)。 程式碼 關掉流同步能有效提高速度。 static const auto io_sync_off = []() { std::ios::sync_with_stdio(false);

leetcode】3.Longest Substring Without Repeating Charactersc語言

Description: Given a string, find the length of the longest substring without repeating characters. Example1: Input: “abcabcbb”

[LeetCode] 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 len

3. Longest Substring Without Repeating Characters重複連續序列。

官網 Given a string, find the length of the longest substring without repeating characters. Examples: Given “abcabcbb”, the answer

LeetCode #003# Longest Substring Without Repeating Charactersjs描述

索引 思路1:分治策略 思路2:Brute Force - O(n^3) 思路3:動態規劃 O(n^2)版,錯解之一:420 ms O(n^2)版,錯解之二:388 ms O(n)版,思路轉變: 100 ms

LeetCode---------Longest Substring Without Repeating Characters解法

++ 序列 break 不重復 bst style eat java代碼 tin 題目如下: Given a string, find the length of the longest substring without repeating characters.

[LeetCode] Longest Substring Without Repeating Characters

fad 設置 length clas ase set () out sts Given a string, find the length of the longest substring without repeating characters. Fo

LeetCode:Longest Substring Without Repeating Characters

很多 時間 最大的 example {} int char ring dex Given a string, find the length of the longest substring without repeating characters. Examples:

LeetCode-Longest Substring Without Repeating Characters

JD integer wke bstr import urn i+1 mage note Given a string, find the length of the longest substring without repeating characters. Examp

LeetCode Longest Substring Without Repeating Characters Python C++ 實現

鄙人根據個人理解寫的比較繁瑣,大佬們海涵,如果有什麼意見希望各位指點一二 題目(來自leetcode網站): 利用python3 或者 C++來實現 題目含義基本為:從給定的一整個字串中找出一個不包含重複字元的最長且連續的字串,的“長度”。 Given a string, fin

LeetCode:Longest Substring Without Repeating Characters(java)

package LeetCode; /** * 題目: * Given a string, find the length of the longest substring without repeating characters. * Examp