154.找出出现至少三次的最长特殊字符串|(力扣)

发布于:2024-06-03 ⋅ 阅读:(149) ⋅ 点赞:(0)

代码解决

class Solution {
public:
    int maximumLength(string s) {
        // 使用unordered_map来存储每个连续子串出现的次数
        unordered_map<string, int> mp;
        string key;  // 存储当前的连续子串
        int ans = -1;  // 存储最终的答案,如果没有符合条件的子串,返回-1
        
        // 遍历字符串s的每一个字符,作为连续子串的起始点
        for (int i = 0; i < s.size(); i++) {
            // 从起始点i开始,寻找最长的连续子串
            for (int j = i; j < s.size(); j++) {
                // 如果当前字符和起始点字符不相同,则结束当前连续子串的查找
                if (s[j] != s[i]) break;
                // 从起始点i到当前位置j形成的连续子串
                key = s.substr(i, j - i + 1);
                // 更新子串出现的次数
                mp[key]++;
                // 如果当前子串出现的次数大于等于3次,则更新最大长度
                if (mp[key] >= 3) {
                    ans = max(ans, (int)key.size());
                }
            }
        }
        return ans;
    }
};

具体步骤

  1. 初始化变量:

    • unordered_map<string, int> mp: 用于存储每个连续子串出现的次数。
    • string key: 存储当前的连续子串。
    • int ans = -1: 初始化答案为 -1,如果没有符合条件的子串,最终会返回 -1。
  2. 双重循环遍历字符串:

    • 外层循环遍历字符串的每个字符 s[i],作为连续子串的起始点。
    • 内层循环从 i 开始,向右寻找最长的连续子串,直到遇到与起始点字符 s[i] 不同的字符。
  3. 处理当前连续子串:

    • key = s.substr(i, j - i + 1): 从 ij 位置形成的子串。
    • mp[key]++: 更新子串 key 出现的次数。
    • 如果当前子串出现的次数大于等于3次,则更新最大长度 ans
  4. 返回结果:

    • 返回最长符合条件的连续子串的长度 ans,如果没有符合条件的子串,则返回 -1。

举例说明

例如,字符串 s = "aaabaaa"

  • 外层循环从 i = 0 开始。
  • 内层循环从 j = 0 开始,找到连续子串 "a","aa","aaa"。
    • "a" 出现 3 次,但长度为 1。
    • "aa" 出现 2 次,不符合条件。
    • "aaa" 出现 2 次,不符合条件。

最终,最长符合条件的子串是 "a",长度为 1,返回 1。

substr 函数

作用

substr 函数用于从字符串中提取子串。

std::string substr(size_t pos = 0, size_t len = npos) const;
参数
  • pos:子串开始的位置,默认为 0。
  • len:子串的长度,默认为 npos,表示直到字符串的末尾。
返回值

返回从 pos 开始的长度为 len 的子串。如果 pos 超出字符串长度,则抛出 std::out_of_range 异常。

示例

std::string str = "Hello, world!";
std::string sub = str.substr(7, 5); // sub 将是 "world"

网站公告

今日签到

点亮在社区的每一天
去签到