代码解决
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; } };
具体步骤
初始化变量:
unordered_map<string, int> mp
: 用于存储每个连续子串出现的次数。string key
: 存储当前的连续子串。int ans = -1
: 初始化答案为 -1,如果没有符合条件的子串,最终会返回 -1。双重循环遍历字符串:
- 外层循环遍历字符串的每个字符
s[i]
,作为连续子串的起始点。- 内层循环从
i
开始,向右寻找最长的连续子串,直到遇到与起始点字符s[i]
不同的字符。处理当前连续子串:
key = s.substr(i, j - i + 1)
: 从i
到j
位置形成的子串。mp[key]++
: 更新子串key
出现的次数。- 如果当前子串出现的次数大于等于3次,则更新最大长度
ans
。返回结果:
- 返回最长符合条件的连续子串的长度
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"