leetcode刷题记录23-2981. 找出出现至少三次的最长特殊子字符串 I

问题描述

给你一个仅由小写英文字母组成的字符串 s 。

如果一个字符串仅由单一字符组成,那么它被称为 特殊 字符串。例如,字符串 "abc" 不是特殊字符串,而字符串 "ddd""zz" 和 "f" 是特殊字符串。

返回在 s 中出现 至少三次  最长特殊子字符串 的长度,如果不存在出现至少三次的特殊子字符串,则返回 -1 。

子字符串 是字符串中的一个连续 非空 字符序列。

示例

示例 1:

输入:s = "aaaa"
输出:2
解释:出现三次的最长特殊子字符串是 "aa" :子字符串 "aaaa"、"aaaa" 和 "aaaa"。
可以证明最大长度是 2 。

示例 2:

输入:s = "abcdef"
输出:-1
解释:不存在出现至少三次的特殊子字符串。因此返回 -1 。

示例 3:

输入:s = "abcaba"
输出:1
解释:出现三次的最长特殊子字符串是 "a" :子字符串 "abcaba"、"abcaba" 和 "abcaba"。
可以证明最大长度是 1 。

提示:

  • 3 <= s.length <= 50
  • s 仅由小写英文字母组成。

问题分析:

我的方法比较简单暴力,首先如何判断一个字符串是特殊子字符串,我们需要单独写一个函数来判断。然后使用map,遍历所有的子串,因为长度只有3-50,所以大概率n^2也能过,把子串中的特殊子字符串及其出现的次数都存里面。然后遍历map,在其中出现3次以上的子字符串中寻找最大长度即可。

代码如下:

class Solution {
public:
    // 判断是不是特殊字符串
    bool judge(string s) {
        for (int k = 1; k < s.size(); k++) {
            if (s[k] != s[k - 1])
                return false;
        }
        return true;
    }
    int maximumLength(string s) {
        unordered_map<string, int> mp;
        int maxL = -1;
        // 遍历子字符串
        for (int i = 0; i < s.size(); i++) {
            for (int j = i; j < s.size(); j++) {
                string q = s.substr(i, j - i + 1);
                // 如果是特殊的
                if(judge(q))
                    mp[q]++;
            }
        }
        for (auto& v : mp) {
            // 出现次数>=3
            if (v.second >= 3)
                // 更新最大长度
                maxL = max(maxL, (int)v.first.size());
        }
        return maxL;
    }
};

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值