一、题目
题目描述
给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出 'o' 字符出现了偶数次最长子字符串的长度。
输入描述
输入是一串小写字母组成的字符串
备注
1 <= s.length <= 5 x 10^5
s 只包含小写英文字母
输出描述
输出是一个整数
示例1
输入
alolobo
1
输出
6
1
说明
最长子字符串之一是 "alolob",它包含'o' 2个。
示例2
输入
looxdolx
1
输出
7
1
说明
最长子字符串是 "oxdolxl",由于是首尾连接在一起的,所以最后一个 'x' 和开头的 'l'是连接在一起的,此字符串包含 2 个'o' 。
示例3
输入
bcbcbc
1
输出
6
1
说明
这个示例中,字符串 "bcbcbc" 本身就是最长的,因为 'o' 都出现了 0 次。
解题思路
核心代码
// 如果'o'字符出现的次数是偶数,则输出字符串的长度
if (num % 2 == 0) {
System.out.println(len);
} else {
// 如果'o'字符出现的次数是奇数,则输出字符串长度减1
System.out.println(len - 1);
}
1
2
3
4
5
6
7
如果 'o' 出现的次数为偶数,那么整个字符串就符合题目的要求:即包含偶数次的 'o'。
如果 'o' 出现的次数为奇数,则只能通过去掉一个字符(任意字符)来使得剩下的子字符串中的 'o' 出现次数变为偶数。去掉一个字符后,最长的可能子字符串的长度就是 len - 1。
为什么这样的方法有效?
偶数情况:
如果总共的 'o' 个数已经是偶数,那么从字符串的任意位置开始到任意位置结束的子字符串,也一定能找到包含偶数次 'o' 的最长子串,这个子串就是原字符串本身。
奇数情况:
如果 'o' 的总数是奇数,那么无论如何,我们至少要移除一个字符才能使 'o' 的数量变为偶数。因此,只需要输出 len - 1 即可。
二、代码
python
# 读取用户输入的字符串
input_str = input("")
# 获取字符串的长度
len_str = len(input_str)
# 初始化'o'字符的计数器
num = 0
# 遍历字符串,统计'o'字符的数量
for chr in input_str:
if chr == 'o':
num += 1
# 如果'o'字符出现的次数是偶数,则输出字符串的长度
if num % 2 == 0:
print(len_str)
else:
# 如果'o'字符出现的次数是奇数,则输出字符串长度减1
print(len_str - 1)
说明:
这段Python代码实现了题目要求的算法,逻辑清晰简洁。下面逐行解释:
-
读取输入 :
input_str = input("")从标准输入读取一个字符串。 -
获取长度 :
len_str = len(input_str)计算字符串的长度,存储在变量len_str中。 -
统计'o'的数量:
num = 0初始化计数器for chr in input_str:遍历字符串中的每个字符if chr == 'o': num += 1如果字符是'o',计数器加1
-
核心逻辑判断:
if num % 2 == 0:检查'o'出现的次数是否为偶数- 如果是偶数:
print(len_str)直接输出原字符串长度 - 如果是奇数:
print(len_str - 1)输出长度减1
算法原理:
- 由于字符串是环形的,我们可以从任意位置开始取子串
- 如果'o'的总数是偶数,那么整个字符串就是符合条件的最大子串
- 如果'o'的总数是奇数,我们至少需要去掉一个字符(可以是任意字符)来使'o'的数量变为偶数
- 去掉一个字符后,最大长度就是原长度减1
时间复杂度 :O(n),只需要遍历一次字符串统计'o'的数量
空间复杂度:O(1),只使用了常数级别的额外空间
示例验证:
- 输入 "alolobo":有2个'o'(偶数),输出6 ✓
- 输入 "looxdolx":有3个'o'(奇数),输出7 ✓
- 输入 "bcbcbc":有0个'o'(偶数),输出6 ✓