题目描述:
给你一个字符串 s,字符串 s 首尾相连成一个环形,请你在环中找出'l'、'o'、'x' 字符都恰好出现了偶数次最长子字符串的长度。
输入描述:
输入是一串小写的字母组成的字符串,注意是小写字母
输出描述:
输出是一个整数 1 ≤ s.length ≤ 5 * 10^5,s只包含小写英文字母
示例1:
输入:alolobo
输出:6
说明:最长子字符串之一是 "alolob",它包含 'l','o'各 2 个,以及 0 个 'x' 。
示例2:
输入:looxdolx
输出:7
说明:最长子字符串是 "oxdolxl",由于是首尾连接在一起的,所以最后一个 'x' 和开头的 'l'是连接在一起的,此字符串包含 2 个 'l' ,2 个 'o' ,2 个 'x' 。
示例3:
输入:bcbcbc
输出:6
说明:字符串 "bcbcbc" 本身就是最长的,因为 'l'、'o'、'x' 都出现了 0 次。
C++源码:
#include <iostream>
#include <string>
using namespace std;
// 辅助函数检查所有计数是否为偶数
bool allEven(int a, int b, int c) {
return a % 2 == 0 && b % 2 == 0 && c % 2 == 0;
}
pair<int, string> maxEvenSubstring(const string& s) {
int n = s.size();
int countL = 0, countO = 0, countX = 0;
int maxLength = 0;
int bestStart = 0;
string maxSubstring = "";
// 遍历字符串,模拟环状结构,但只需遍历一次,因为我们在寻找连续的子串
for (int start = 0; start < n; ++start) {
countL = countO = countX = 0; // 重置计数器
for (int i = start; i < n + start; ++i) {
char c = s[i % n];
if (c == 'l') countL++;
else if (c == 'o') countO++;
else if (c == 'x') countX++;
// 检查当前子串是否符合条件,且长度是否更优
if (allEven(countL, countO, countX) && i - start + 1 > maxLength) {
maxLength = i - start + 1;
bestStart = start;
}
}
}
maxSubstring = s.substr(bestStart, maxLength);
return make_pair(maxLength, maxSubstring);
}
int main() {
string s;
cin >> s;
pair<int, string> result = maxEvenSubstring(s);
cout << result.first << endl;
system("pause");
return 0;
}