#C0E41. 华为OD机试E卷 - 环中最长子串/字符成环找偶数O
华为OD机试E卷 - 环中最长子串/字符成环找偶数O
题目链接
华为OD机试E卷 - 环中最长子串/字符成环找偶数O(Java & Python& JS & C++ & C )
https://blog.csdn.net/banxia_frontend/article/details/141921993
最新华为OD机试
题目描述
给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出 'o' 字符出现了偶数次最长子字符串的长度。
输入描述
输入是一串小写字母组成的字符串
备注
1 <= s.length <= 5 x 10^5 s 只包含小写英文字母
输出描述
输出是一个整数
示例1
输入
alolobo
输出
6
说明
最长子字符串之一是 “alolob”,它包含’o’ 2个。
示例2
输入
looxdolx
输出
7
说明
最长子字符串是 “oxdolxl”,由于是首尾连接在一起的,所以最后一个 ‘x’ 和开头的 ‘l’是连接在一起的,此字符串包含 2 个’o’ 。
示例3
输入
bcbcbc
输出
6
说明
这个示例中,字符串 “bcbcbc” 本身就是最长的,因为 ‘o’ 都出现了 0 次。
解题思路
核心代码
// 如果'o'字符出现的次数是偶数,则输出字符串的长度
if (num % 2 == 0) {
System.out.println(len);
} else {
// 如果'o'字符出现的次数是奇数,则输出字符串长度减1
System.out.println(len - 1);
}
- 如果 'o' 出现的次数为偶数,那么整个字符串就符合题目的要求:即包含偶数次的 'o'。
- 如果 'o' 出现的次数为奇数,则只能通过去掉一个字符(任意字符)来使得剩下的子字符串中的 'o' 出现次数变为偶数。去掉一个字符后,最长的可能子字符串的长度就是
len - 1
。
为什么这样的方法有效?
-
偶数情况:
- 如果总共的 'o' 个数已经是偶数,那么从字符串的任意位置开始到任意位置结束的子字符串,也一定能找到包含偶数次 'o' 的最长子串,这个子串就是原字符串本身。
-
奇数情况:
- 如果 'o' 的总数是奇数,那么无论如何,我们至少要移除一个字符才能使 'o' 的数量变为偶数。因此,只需要输出
len - 1
即可。
- 如果 'o' 的总数是奇数,那么无论如何,我们至少要移除一个字符才能使 'o' 的数量变为偶数。因此,只需要输出
Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 创建一个Scanner对象,用于读取用户输入
Scanner in = new Scanner(System.in);
// 读取用户输入的字符串
String input = in.nextLine();
// 将输入的字符串转换为字符数组
char[] chrs = input.toCharArray();
// 获取字符串的长度
int len = chrs.length;
// 初始化'o'字符的计数器
int num = 0;
// 遍历字符数组,统计'o'字符的数量
for (char chr : chrs) {
if (chr == 'o') {
num += 1;
}
}
// 如果'o'字符出现的次数是偶数,则输出字符串的长度
if (num % 2 == 0) {
System.out.println(len);
} else {
// 如果'o'字符出现的次数是奇数,则输出字符串长度减1
System.out.println(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)
JavaScript
// 引入readline模块,用于读取用户输入
const readline = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
// 询问用户输入字符串
readline.on('line', (input) => {
// 获取字符串的长度
const len = input.length;
// 初始化'o'字符的计数器
let num = 0;
// 遍历字符串,统计'o'字符的数量
for (let chr of input) {
if (chr === 'o') {
num += 1;
}
}
// 如果'o'字符出现的次数是偶数,则输出字符串的长度
if (num % 2 === 0) {
console.log(len);
} else {
// 如果'o'字符出现的次数是奇数,则输出字符串长度减1
console.log(len - 1);
}
readline.close();
});
C++
#include <iostream>
#include <string>
using namespace std;
int main() {
// 创建一个字符串变量,用于存储用户输入
string input;
// 读取用户输入的字符串
getline(cin, input);
// 获取字符串的长度
int len = input.size();
// 初始化'o'字符的计数器
int num = 0;
// 遍历字符串,统计'o'字符的数量
for (char chr : input) {
if (chr == 'o') {
num += 1;
}
}
// 如果'o'字符出现的次数是偶数,则输出字符串的长度
if (num % 2 == 0) {
cout << len << endl;
} else {
// 如果'o'字符出现的次数是奇数,则输出字符串长度减1
cout << len - 1 << endl;
}
return 0;
}
C语言
#include <stdio.h>
#include <string.h>
int main() {
char input[500001]; // 创建一个字符数组,用于存储用户输入的字符串,最大长度500000
scanf("%s", input); // 读取用户输入的字符串
int len = strlen(input); // 获取字符串的长度
int num = 0; // 初始化'o'字符的计数器
// 遍历字符串,统计'o'字符的数量
for (int i = 0; i < len; i++) {
if (input[i] == 'o') {
num++;
}
}
// 如果'o'字符出现的次数是偶数,则输出字符串的长度
if (num % 2 == 0) {
printf("%d\n", len);
} else {
// 如果'o'字符出现的次数是奇数,则输出字符串长度减1
printf("%d\n", len - 1);
}
return 0;
}
完整用例
用例1
looxdolx
用例2
alolobo
用例3
bcbcbc
用例4
o
用例5
oooooo
用例6
abcdefg
用例7
ooabcd
用例8
oabcd
用例9
oooabcd
用例10
oooabcdoo