1. 程式人生 > >字串中沒有重複的字元最大子串

字串中沒有重複的字元最大子串

在一個字串中尋找沒有重複字母的最長子串。
如在“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。