华为OD E卷(100分)39-最长子字符串的长度(二)
前言
工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。
题目描述
给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出'l'、'o'、'x' 字符都恰好出现了偶数次最长子字符串的长度。
输入
输入是一串小写的字母组成的字符串s。
- 1 <= s.length <= 5 x 10^5
- s 只包含小写英文字母。
输出
输出是一个整数
示例
示例1
输入
alolobo
输出6
说明
最长子字符串之一是 "alolob",它包含 'l','o'各 2 个,以及 0 个 'x' 。
示例2
输入
looxdolx
输出7
说明
最长子字符串是 "oxdolxl",由于是首尾连接在一起的,所以最后一个 'x' 和开头的 'l'是连接在一起的,此字符串包含 2 个'o' 。
示例3
输入
bcbcbc
输出6
说明
这个示例中,字符串 "bcbcbc" 本身就是最长的,因为 'o' 都出现了 0 次。
解题思路
循环,每一次将第一个字符放到最后组成一个新的字符串进行查找
题解
Java实现
package huawei.e100;
import java.util.Scanner;
/**
* @author arnold
* @date 2024年12月24日
* 最长子字符串的长度(二)
*/
public class T39_ZuiChangZiChuan {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
String str = sc.nextLine();
int maxLen = run(str);
System.out.println(maxLen);
}
}
// 循环,每一次将第一个字符放到最后组成一个新的字符串进行查找
static int run(String str) {
int maxLen = getMaxLen(str);
for (int i = 1; i < str.length(); i++) {
str = str.substring(1) + str.substring(0,1);
int len = getMaxLen(str);
maxLen = Math.max(maxLen, len);
}
return maxLen;
}
static int getMaxLen(String s) {
int maxLen = 0;
int l_num = 0;
int o_num = 0;
int x_num = 0;
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i) == 'l') {
l_num++;
} else if (s.charAt(i) == 'o') {
o_num++;
} else if (s.charAt(i) == 'x') {
x_num++;
}
if(l_num % 2 == 0 && o_num % 2 == 0 && x_num % 2 == 0) {
maxLen = Math.max(maxLen, i+1);
}
}
return maxLen;
}
}