C++實現(xiàn)無重復字符的最長子串
題目及要求:
給定一個字符串 s ,請你找出其中不含有重復字符的 最長子串 的長度。
提示:
0 <= s.length <= 5 * 104
s 由英文字母、數(shù)字、符號和空格組成
原創(chuàng)代碼:
class Solution {
public:
int lengthOfLongestSubstring(string s)
{
int begin=0;//每個當前子串的開頭
int end=0;//每個當前子串的末尾
int value=0;//判斷下一個字符是否屬于當前子串
int max=0;//記錄歷史字串的最大元素個數(shù)
int now=0;//儲存當前字串的元素個數(shù)
string str;//代表當前字串
if(s.size()==0)
return 0;
while(end<=(s.size()-1))
{
value=str.find(s[end],0);
if(value!=-1)
{
str.erase(0,value+1);
begin=end-(str.size()-value);
}
str.push_back(s[end]);
now=str.size();
max=now>max?now:max;
end++;
}
return max;
}
};
輸出示例:
示例 1:
輸入: s = “abcabcbb”
輸出: 3
解釋: 因為無重復字符的最長子串是 “abc”,所以其長度為 3。
示例 2:
輸入: s = “bbbbb”
輸出: 1
解釋: 因為無重復字符的最長子串是 “b”,所以其長度為 1。
示例 3:
輸入: s = “pwwkew”
輸出: 3
解釋: 因為無重復字符的最長子串是 “wke”,所以其長度為 3。
請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。
示例 4:
輸入: s = “”
輸出: 0
代碼思路:
首先:
定義變量
int begin=0;//每個當前子串的開頭 int end=0;//每個當前子串的開頭 int value=0;//判斷下一個字符是否屬于當前子串 int max=0;//記錄歷史字串的最大元素個數(shù) int now=0;//儲存當前字串的元素個數(shù) string str;//代表當前字串
其次:
通過以下條件判斷形參string s是否為空字符串
if(s.size()==0) return 0;
再其次:
若形參string s不是空字符串,由于
int end=0;//每個當前子串的末尾
則用end來引入新元素,每判斷一次新元素與當前子串的關(guān)系,則end++
最后:
若新元素與當前的關(guān)系表明新元素不與當前子串內(nèi)的元素重復則直接將新元素加入子串,若新元素與當前的關(guān)系表明新元素與當前子串內(nèi)的元素重復則將子串含有沖突元素的前半部分刪除并將新元素加入到當前子串
反思所得:
在本次編程過程中我經(jīng)常出現(xiàn)提示堆棧內(nèi)存溢出的問題,之后發(fā)現(xiàn)是對形參string s是空字符串的情況沒加以控制,在未來的編程中我會更加注意。
而且我還學會了利用條件運算符來記錄記錄歷史字串的最大元素個數(shù),即
max=now>max?now:max;
LeetCode鏈接:
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
到此這篇關(guān)于C++實現(xiàn)無重復字符的最長子串的文章就介紹到這了,更多相關(guān)C++ 無重復字符的最長子串內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++如何通過ostringstream實現(xiàn)任意類型轉(zhuǎn)string
再使用整型轉(zhuǎn)string的時候感覺有點棘手,因為itoa不是標準C里面的,而且即便是有itoa,其他類型轉(zhuǎn)string不是很方便。后來去網(wǎng)上找了一下,發(fā)現(xiàn)有一個好方法2013-09-09
QT實戰(zhàn)之實現(xiàn)圖片瀏覽系統(tǒng)
這篇文章主要介紹了如何利用QT編寫一個圖片瀏覽系統(tǒng),可以支持自動播放,左右拖動切換,點擊列表切換,點擊按鈕切換等功能,感興趣的小伙伴可以跟隨小編一起了解一下2023-04-04

