題目描述
給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。
示例 :
輸入:
"abcabcbb"
輸出:3
解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。
解題思路:
根據給出的示例,首先將字串通過tochararray()
轉化為字元陣列,然後遍歷陣列元素並將其插入的list
集合中,同時判斷集合中是否已經存在該字元。如果存在,則計算插入元素前的集合長度,然後將集合清空,將當前字元插入空白集合中,否則繼續插入新的陣列元素。最終最長的集合長度即為最長子串的長度。**如下:
private
static
intlengthoflongestsubstring
(string s)
else
// 如果集合中只存在乙個元素或者重複元素,則不會進入else語句,所以此處需要新增乙個判斷
length =
(length >= substring.
size()
)? length : substring.
size()
;// 每次迴圈完成後,將得到的子字串長度和之前的maxlength作比較,如果大於則替換maxlength,反之則保持不變
maxlength =
(length >= maxlength)
? length : maxlength;
}// 返回最大子字串長度
return maxlength;
}
執行以上**,能通過測試用例,但提交**卻出現bug。經檢查,發現**中的substring.clear()
有問題,這裡不應該將substring
清空,如字串abcdbfg
,如果採用上面的**,當讀取到第二個b
時,呼叫clear()
就會將集合中的abcd
給刪掉,最後的結果就是bfg
,而正確的結果是cdbfg
。正確的方式是在插入b
之前,將最後乙個b
之前的元素給刪掉。**如下:
private
static
intlengthoflongestsubstring
(string s)
else
length = length >= substring.
size()
? length : substring.
size()
; maxlength =
(length >= maxlength)
? length : maxlength;
}return maxlength;
}
以上**經測試,能通過abcdbfg
示例,但是提交後仍然出錯,987個測試用例通過了986個,最後乙個提示超出時間限制。測試上述**,發現時間主要花在以下兩行**上。
// 使用這行**比substring.clear()平均多花10ms左右
int index = substring.
lastindexof
(c)+1;
// 而該行**直接將執行時間從60ms拉長至200+,最終導致時間超長
substring = substring.
sublist
(index, length)
;
經考慮,上面的**是將重複字元前面的元素從substring
中刪除從而取子集合,可以換一種思路,不用刪除元素,而是將最後一次出現的重複元素的下標記錄下來,然後和集合的length
相減,同樣相當於得到子集合的長度。具體**如下:
private
static
intlengthoflongestsubstring
(string s)
else
// 相當於計算子集合的長度
length = substring.
size()
- index;
maxlength = length >= maxlength ? length: maxlength;
}return maxlength;
}
提交**,可通過所有的測試用例,時間也控制在30ms左右,後續在思考更優的實現方法。 leetcode 3 無重複的字串
給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew 輸出 3 ...
leetcode 3 無重複字元的最長字元子串
堅持打卡!題目 給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwk...
leetcode 3 最長無重複字串
3.longest substring without repeating characters 題面 given a string,find the length of the longest substring without repeating characters.給定字串,找到最長無重複字...