题目描述
给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出 ‘o’ 字符出现了偶数次最长子字符串的长度。
题目要求
- 输入:是一串小写字母组成的字符串
- 输出:是一个整数
示例
示例1
- 输入:‘alolobo’
- 输出:6
- 说明:最长子字符串之一是 “alolob”,它包含’o’ 2个。
示例2
- 输入:‘looxdolx’
- 输出:7
- 说明:最长子字符串是 “oxdolxl”,由于是首尾连接在一起的,所以最后一个 ‘x’ 和开头的 ‘l’是连接在一起的,此字符串包含 2 个’o’ 。
示例3
- 输入:‘bcbcbc’
- 输出:6
- 说明:这个示例中,字符串 “bcbcbc” 本身就是最长的,因为 ‘o’ 都出现了 0 次。
备注
- 1 <= s.length <= 5 x 10^5
- s 只包含小写英文字母
解题思路
- 统计整个字符串中字符 'o' 出现的总次数。
- 如果 'o' 的总次数为偶数,那么整个字符串本身就是满足条件的最长子字符串,其长度即为答案。
- 如果 'o' 的总次数为奇数,由于字符串是环形的,我们总可以找到一个长度为
len - 1的子字符串,其中 'o' 的出现次数为偶数(即总次数减一)。这将是可能的最长长度。
优化后的Java解法
import java.util.Scanner;
/**
* 计算环形字符串中包含偶数个'o'的最长子串长度
* @since 2026-04
*/
public class LongestSubString {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
if (in.hasNextLine()) {
String input = in.nextLine();
solve(input);
}
in.close();
}
/**
* 核心解题方法
* @param s 输入的字符串
*/
public static void solve(String s) {
int len = s.length();
int countO = 0;
// 统计字符 'o' 的总出现次数
for (int i = 0; i < len; i++) {
if (s.charAt(i) == 'o') {
countO++;
}
}
// 根据 'o' 出现次数的奇偶性判断最长子串长度
if (countO % 2 == 0) {
System.out.println(len);
} else {
System.out.println(len - 1);
}
}
}