字串中沒有重複的字元最大子串
阿新 • • 發佈:2019-01-02
在一個字串中尋找沒有重複字母的最長子串。
如在“abcabcbb”則結果“abc”;
“bbbbb”結果為“b”
“pwwkew”結果為“wke”
需要考慮的點:
字符集,只有字母,數字+字母,或ASCII碼
大小寫是否敏感。
思路:採用雙索引 l,r建立滑動視窗s[l…r];
建立一個大小為256的陣列,存放大小為字元值所在位置出現的次數,如“abbabcde”
‘a’97;
‘b’98;
‘c’99;
‘d’100依次類推。
首先設定freq[256]={0};
依次索引r遍歷a 則freq[97]=1;
遍歷到b,則freq[98]=1;
再次遍歷到b時,發現freq==1了,所以索引l++,並且把當前freq[l]–重置為0。文字晦澀,看程式吧。
#include<iostream>
#include<string>
#include<cassert>
#include<algorithm>
using namespace std;
class Solution{
public:
int lengthOfLongestSubstring(string s){
int freq[256] = { 0 };
int l = 0, r = -1;
int res = 0;//用來儲存沒有重複的子串的長度
while (l < s .size())
{
if (r+1<s.size()&&freq[s[r + 1]] == 0){
r++;
freq[s[r]]++;
}
else//下一個位置的值與前面的值重複了,freq[s[r+1]]==1或者r已經到頭了
{
freq[s[l]]--;
l++;
}
res = max(res, r - l + 1 );
}
return res;
}
};
int main()
{
string s = "abbcdeffsfsc";
cout << Solution().lengthOfLongestSubstring(s) << endl;
return 0;
}
結果返回 5。