Leetcode學習 3 無重複字元的最長子串

2021-10-10 14:32:59 字數 1614 閱讀 5198

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。

示例 1:

輸入: 「abcabcbb」

輸出: 3

解釋: 因為無重複字元的最長子串是 「abc」,所以其長度為 3。

示例 2:

輸入: 「bbbbb」

輸出: 1

解釋: 因為無重複字元的最長子串是 「b」,所以其長度為 1。

示例 3:

輸入: 「pwwkew」

輸出: 3

解釋: 因為無重複字元的最長子串是 「wke」,所以其長度為 3。

請注意,你的答案必須是 子串 的長度,「pwke」 是乙個子串行,不是子串。

首先考慮從輸入字串的起點開始,有短到長(0~n)逐一驗證,子串中是否有重複字元,這樣的好處是,當我們第一次發現重複字元時,能夠保證兩個重複字元之間所有的字元都是不重複的,這個為我們下面減輕程式的計算量做好了鋪墊。

接下來我們分析怎麼處理發現重複字元的問題,當第一次發現重複字元時,首先肯定是更新最大長度,然後我們要做的是移動子串的頭指標,可是移動到**?很顯然,我們不能簡單後移一位因為出現重複的字元不一定是第乙個字元,所以我們要將子串的頭指標移動到第乙個重複字元的後乙個位置,然後繼續檢驗新的子串中是否有重複。

那麼新的問題來了,新的子串長度還是從1到n嗎?當然你可以這麼做,但是一開始提到的**黑體字**部分就起到作用了,既然中間都不重複那新子串的長度就是兩個重複字元之間子串的長度(包含這兩個重複的),這樣便大大減少了重複的工作,所以下面的**看似使用三層for迴圈,實際的中間的for可以換成while僅作為條件控制,較壞的情況下最多也是對輸入串進行26n次遍歷,當然這裡可以考慮極端情況當len_max等於26時直接返回結果,每次更新len_max判斷,但是我認為這種極端情況是極少發生的,而每次更新附加判斷也增加計算量,所以你認為合理的話也可以加上。

以上就是我這個題的解題思路。

class solution 

//單字元 返回 1

if(size ==1)

//子串起點 子串長度 最長子串長度

int front =

0, len =

1, len_max =1;

//迴圈控制變數

int i, j;

//初始化控制變數

i =1;

//從起點開始遍歷輸入字串

//停止條件:子串起點與最長子串和小於輸入串長度

for(front =

0; front < size-len_max;)}

//如果非正常結束(跳出迴圈)

if( i != j)

//正常結束迴圈

else}}

return len_max;}}

;

除此之外還有另乙個解題思路(我並沒有實現)建立乙個長度位 26 x n 的二維陣列,對輸入串進行一次遍歷,記錄各個字母出現的位置,然後分別計算兩個相鄰字元位置的差值,保留最大差值,並加1返回。相比我上乙個想法,這個思路更簡單,在某些場景可能更快,但是會消耗更多的空間而且有很多冗餘計算。個人感覺沒有前面的想法好。

Leetcode刷題之路 3 無重複的最長字串

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew 輸出 3 ...

leetcode 第3題 無重複字元的最長字串

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。注意 區分字串和子串行,子串必須相鄰,子串行不一定 用乙個陣列實現hashmap,key為字元,value為字元最後出現的位置,初始化為 1。陣列大小 因為ascii表只有256個字元,然而鍵盤只能表示128個,所以用128也行。用乙個 ...

LeetCode刷題 3 無重複字元的最長字串

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew 輸出 3 ...