至多包含两个不同字符的最长子串-哈希表与双指针

题目描述:

给定一个字符串 s ,找出 至多 包含两个不同字符的最长子串 t 。

示例 1:
输入: “eceba”
输出: 3
解释: t 是 “ece”,长度为3。

示例 2:
输入: “ccaabbb”
输出: 5
解释: t 是 “aabbb”,长度为5

解题思路:

可以利用双指针(i,j)在字符串上进行移动,来判定满足要求的最长子串。那么指针如何计算长度,i怎么移动,j怎么移动呢?

  • 很显然,子串的长度就是i与j之间的距离

  • i就在for循环下,一直往前走

  • j显然要在(i,j)之间包含的字符种类数超过2个时进行移动,一直要使(i,j)之间包含的字符种类数为2,那如何统计二者之间的字符种类数呢?、

    • hash表显然是一个好的工具,统计(i,j)之间的字符种类数-------------->hash.size()
    • 当(i,j)不再包含某个字符,则需要在hash表中更新(删除它)------->hash.erase(key)

提交代码

class Solution {
public:
    int lengthOfLongestSubstringTwoDistinct(string s) {
        unordered_map<char, int> map;//定义哈希表
        int result=0;
        //i代表字符串的字符,j代表hash表的
       for(int i=0,j=0;i<s.size();i++)
       {
           map[s[i]]++;//统计扫描的字符,当前各自的个数
           while(map.size()>2)//若当前统计了2个字符
           {
               map[s[j]]--;//统计的字符中,最前面的下标,一个一个移动
               if(map[s[j]]==0)//若j号字符已经减为0,说明这个字符是现在统计的多余的那个
               {
                   map.erase(s[j]);
               }
               j++;
           }
           result=max(result,i-j+1);
       }
       return result;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值