467. 环绕字符串中唯一的子字符串 固定最后一个字母,求出所有字串的个数

思路

  1. 回答一个核心的问题?如何避免重复?
  2. 首先我们知道每一个字串,最后一个字符(或者是第一个字符)只有26种可能性,以字母 a a a为结尾的长度为 l e n len len的字符串会产生 l e n len len个字串,那么我们用 m a p < c h a r , i n t > map<char,int> map<char,int>记录以字母 c h a r char char为结尾的出现的最大字串的长度,长度为 m a p < c h a r , i n t > map<char,int> map<char,int> i n t int int
  3. 这样的话我们就可以得到我们的答案了。
  4. leetcode这里讲了很多类似的题。

代码

const int maxn = 100005;
class Solution {
public:

    int findSubstringInWraproundString(string p) {
        int n = p.size();
        if (n == 0) {
            return 0;
        }
        //vector<vector<int>>dp(26);
        map<char, int>mp;
        p = '@' + p;
        int w = 1;
        for (int i = 1; i < n + 1; i++) {
            if ((int)p[i] == (int)p[i - 1] + 1 || p[i - 1] == 'z' && p[i] == 'a') {
                w += 1;
            }
            else {
                w = 1;
            }
            if (mp.count(p[i]) == 0) {
                mp[p[i]] = w;
            }
            else {
                mp[p[i]] = max(mp[p[i]], w);
            }
        }
        int ans = 0;
        //map<char, int>::iterator it;
        for (auto [key, val] : mp) {// windows上似乎不能这么遍历
            ans += val;
        }
        
        // for (auto& it : mp) {
        //     ans += it.second;
        // }
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值