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;
}
};