华为OD E卷(100分)39-最长子字符串的长度(二)

发布于:2025-02-11 ⋅ 阅读:(93) ⋅ 点赞:(0)

 前言

        工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。

题目描述

        给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出'l'、'o'、'x' 字符都恰好出现了偶数次最长子字符串的长度。

输入

        输入是一串小写的字母组成的字符串s。

  1. 1 <= s.length <= 5 x 10^5
  2. 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;
	}

}


网站公告

今日签到

点亮在社区的每一天
去签到