Leetcode 3 尋找最大的連續不重複子串
第一種方法
class Solution {
public: int lengthOfLongestSubstring(string s) {
if (s.length() == 0) return 0; int l = 0; int r = 0; //[l...r]包含了當前最大長度的不重複連續子串
int max_length = 1;
while (l < s.length() && (r+1) <s.length())
{
string sub_str = s.substr(l, r - l + 1);
int pos = sub_str.find(s[r + 1]); //r和子串中的字符重複,找到子串中的相同字符k,l=k+1,r++
if ( pos!=string::npos)
{
cout << pos << endl;
l =l+ pos + 1;
cout << "l:" << l << endl;
r++;
}
else //r和子串中的字符不重複,r++
{
r++;
cout <<"r:"<< r << endl;
if (max_length < (r - l + 1)) max_length = r - l + 1;
}
}
return max_length;
}
};
第二種方法
class Solution {
public:int lengthOfLongestSubstring(string s) {
if (s.length() == 0)
return 0;
int freq[256] = { 0 };
int l = 0; int r = -1; //[l...r]包含了當前最大長度的不重複連續子串
int max_length = 0;
while (l < s.length())
{
if (r + 1<s.length()&&freq[s[r + 1]] == 0)//如果下一個元素的頻率爲0,也就是沒有在之前的子串中出現過
{
r++;
freq[s[r]]++;
}
else //如果出現過,l向前移動一位 L不是應該移到重複的位置之前嗎?
{
freq[s[l]]--;
l++;
}
max_length = max(max_length, r - l + 1);
}
return max_length;
}
};