环中最长子串字符成环找偶数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 ✓
相关推荐
老师我太想进步了202610 分钟前
【数据结构-4】算法美学之顺序表
数据结构·算法
风影同志7832424 分钟前
编码器是激活函数吗?—— 一个看起来很像、其实不是的类比
算法
UIU11428 分钟前
P1481 魔族密码
c++·算法·动态规划
加宝的起点雷达4 小时前
40 条候选里 38 条来自同一个源,主卡整屏重样
人工智能·算法·创业
秋天的怀念_David4 小时前
算法一千零一夜 · 第二十六夜 协议的母语
java·spring boot·算法
闻缺陷则喜何志丹7 小时前
【C++特性】四种类型转
c++·算法·类型转换
喵本喵叁肆7 小时前
用 Boosting 把弱隐私算法炼成强隐私算法(英文原题:Boosting and Differential Privacy (FOCS 2010))
算法·集成学习·boosting
青梅味猪大肠7 小时前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统