环中最长子串字符成环找偶数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 ✓
相关推荐
疯狂打码的少年11 分钟前
【数据库技术】多值依赖与第四范式(4NF)
数据库·笔记·算法
子文雨19 分钟前
基于 uC3845 与 ATtiny13 双芯片架构的 8.4V/2.5Ah 锂电池智能充电器设计
单片机·嵌入式硬件·算法
青山木24 分钟前
Hot 100 --- 数组中的第K个最大元素
java·数据结构·算法·排序算法
玛卡巴卡ldf28 分钟前
【AICoding】笔试提示词设计思路
java·算法·ai编程
明月_清风39 分钟前
位图与布隆过滤器:海量数据下的"存在性判断"艺术
前端·后端·算法
Rnan-prince42 分钟前
堆与TopK · 从零到通透 —— 9 节全系列复盘
python·算法
明月_清风1 小时前
Hash 表从入门到精通:Go 实战与工程细节
前端·后端·算法
nbsaas-boot1 小时前
多智能体系统的架构边界:任务编排、共享状态与故障隔离设计
人工智能·算法·动态规划
wuyk5552 小时前
12.归并排序:分治思想的稳定排序算法
开发语言·数据结构·算法·排序算法
吴声子夜歌2 小时前
ApacheCommons——commons-text(模板替换与文本算法)
java·开发语言·算法·apache