环中最长子串字符成环找偶数O

一、题目

题目描述

给你一个字符串 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代码实现了题目要求的算法,逻辑清晰简洁。下面逐行解释:

  1. 读取输入 :input_str = input("") 从标准输入读取一个字符串。

  2. 获取长度 :len_str = len(input_str) 计算字符串的长度,存储在变量 len_str 中。

  3. 统计'o'的数量:

    • num = 0 初始化计数器
    • for chr in input_str: 遍历字符串中的每个字符
    • if chr == 'o': num += 1 如果字符是'o',计数器加1
  4. 核心逻辑判断:

    • 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 ✓
相关推荐
垆边人似月.34 分钟前
删边使每个连通块权值和为 target
算法·深度优先·图论
xxwl58536 分钟前
区域赛算法模版第四章---数据结构
数据结构·c++·算法
xxwl5851 小时前
第六章---计算几何
笔记·学习·算法
Logic1012 小时前
C语言/数据结构二维数组题解:找出行列O个数均为偶数的格子——奇偶性预处理+二次遍历
c语言·数据结构·算法·二维数组·时间复杂度·动态内存分配·奇偶性
程序猿阿森2 小时前
【机器学习实战】朴素贝叶斯算法详解:从概率基础到商品评论情感分析
算法·机器学习·概率论
xxwl5853 小时前
区域赛算法模版第五章---数学与数论
c++·笔记·算法
看浪的路人3 小时前
第6讲:Agent 安全体系——Prompt 注入防御、工具调用审计与输出合规
人工智能·算法
局部有解3 小时前
LeetCode Hot100 438 找到字符串中所有字母异位词
c++·算法·leetcode
垆边人似月.3 小时前
移动长度 k 子串使字符串变成回文
数据结构·算法
pride.li3 小时前
第12章 Python 教程-流程控制:循环结构
linux·服务器·python·算法