[LeetCode]无重复字符的最长子串 C++版本

题目:

 

利用unordered_set<char> lookup; 数据结构哈希集合;滑动窗口的方式设定左指针和右指针,利用unodered_set中的erase()  insert()  count()方法,右指针移动的条件是右指针下一指向的字母没有出现在哈希集合中,左指针在移动时会erase(s[left - 1]);即从哈希集合中删除左指针之前指向的那个字母,把左指针同时当作for 循环的计数器,实现左指针的不断右移。

count()方法用于判定某个元素在哈希集合中出现过几次。比如从这句话可以看出 s[i] 这个元素在lookup中出现过五次。我们在此用于判断字符是否在哈希集合中出现过。

int cnt = lookup.count(s[i]) ;//cnt = 5;
/*
lookup.count(s[i]) 是一种在 unordered_set 中查找特定元素的方式。
它返回一个整数值,表示特定元素在集合中的出现次数。
*/
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_set<char> lookup;
        int len = s.length();
		int left = 0;int right = 0;
		int maxlen = 0;int curlen;
		lookup.insert(s[left]);
        for(left;left<len;left++){
        	if(left!=0) lookup.erase(s[left-1]);
        	//左指针向右移动时,抹去之前的字符 
        	while(right+1<len&&!(lookup.count(s[right+1]))){
			//右指针没有到达最右边且下一个字符没有出现过 
        		right++;
        		lookup.insert(s[right]);
			}
			curlen = right + 1 - left;
			maxlen = max(maxlen,curlen);
		}
		//cout<<"left  = "<<left<<"right ="<<right<<endl;
		return maxlen;
	}
};

之前没有接触过滑动窗口,之前遇到都想暴力,结果解不出来,现在有更好的解法了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值