数据结构——滑动窗口Leetcode3寻找最大的连续不重复子串

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值