小木leetcode刷题记-2021.10.26

       这题我这一拿到手,其实第一印象是双重for循环,后来循着循着发现不对,第一个字符串重复部分其实好搞,那中间的字符串呢。观看了一些题解之后,觉着确实应该设立一个头结点,来保证开始计算的地方,只要重复,就更改初始地段。话不多说,上代码。

class Solution {
public:
	int lengthOfLongestSubstring(std::string s) {
		//如果为空,直接返回0就好
		if (s.empty())
			return 0;
		//定义一个头结点,一个计算的最大值,一个到时候可以排除有无重复的mymap
		int head = 0, max_num = 0;
		std::unordered_map<char, int>mymap;
		for (int end = 0; end < s.size(); end++)
		{
			//map.count(Key)返回值为1或者0,1返回存在,0返回不存在,返回的是布尔类型的值
			if (mymap.count(s[end]))
			{
				//确保head要往前走,而不是向后倒
				head = std::max(head,mymap[s[end]] + 1);
			}
			max_num = std::max(max_num, end - head + 1);
			mymap[s[end]] = end;
		}
		return max_num;
	}
};

 通过这题,我了解了unordered_map,哈希,并且最最主要的是,对head和end的用法似乎更熟练了,未来可期,加油。

备注,这是官方比较经典的一个解答

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.size() == 0) return 0;
        unordered_set<char> lookup;
        int maxStr = 0;
        int left = 0;
        for(int i = 0; i < s.size(); i++){
//此处用while做循环,用left++,其实本质上就是让head逐个前移,本质不如我原答中key直接找快些
            while (lookup.find(s[i]) != lookup.end()){
                lookup.erase(s[left]);
                left ++;
            }
            maxStr = max(maxStr,i-left+1);
            lookup.insert(s[i]);
    }
        return maxStr;
        
    }
};

然后我以上解法来源于leetcode中一名为“大鹏”的解法,思路图为

来首诗:摘自李商隐                                     《无题》

八岁偷照镜,长眉已能画。

十岁去踏青,芙蓉作裙衩。

十二学弹筝,银甲不曾卸。

十四藏六亲,悬知犹未嫁。

十五泣春风,背面秋千下。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值