华为OD机试 2024D卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
给你一个字符串s,首尾相连成一个环形,请你在环中找出o字符出现了偶数次最长子字符串的长度。
二、输入描述
输入由一个小写字母组成的字符串s
三、输出描述
输出是一个整数
1、输入
alolobo
2、输出
6
3、说明
最长子字符串之一是alolob,它包含2个o
四、解题思路
我们需要找到一个环形字符串中包含字符 ‘o’ 出现次数为偶数次的最长子字符串。环形字符串的处理需要考虑起点在任意位置的情况。因此,我们可以将原字符串拼接一次,形成一个双倍长度的字符串,这样就可以使用滑动窗口技术来处理循环字符串的问题。
步骤:
- 双倍字符串:将原字符串拼接一次,形成一个双倍长度的字符串。
- 滑动窗口:使用滑动窗口技术来遍历双倍长度的字符串,计算每个窗口内的字符 ‘o’ 的出现次数。
- 检查偶数次:在滑动窗口内,如果字符 ‘o’ 的出现次数为偶数次,则更新最长子字符串的长度。
五、Java算法源码
public class Test01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取输入的字符串
String s = scanner.nextLine();
scanner.close();
// 输出最长子字符串长度
System.out.println(findLongestEvenO(s));
}
public static int findLongestEvenO(String s) {
int n = s.length();
String doubleS = s + s; // 将字符串拼接一次
int maxLength = 0;
// 遍历每个起点
for (int i = 0; i < n; i++) {
int countO = 0; // 计数'o'的数量
// 从当前起点i开始的子字符串
for (int j = i; j < i + n; j++) {
if (doubleS.charAt(j) == 'o') {
countO++;
}
// 检查'o'的数量是否为偶数
if (countO % 2 == 0) {
maxLength = Math.max(maxLength, j - i + 1);
}
}
}
return maxLength;
}
}
六、效果展示
1、输入
looxdolx
2、输出
7
3、说明
最长子字符串oxdolxl,由于是首尾连接一起的, 所以最后一个x和开头的l是连接在一起的此字符串包含2个o
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。