分割均衡字符串
2025华为OD机试 - 华为OD上机考试 100分题型
华为OD机试真题目录点击查看: 华为OD机试真题题库目录|机考题库 + 算法考点详解
题目描述
均衡串定义:字符串中只包含两种字符,且这两种字符的个数相同。
给定一个均衡字符串,请给出可分割成新的均衡子串的最大个数。
约定:字符串中只包含大写的 X 和 Y 两种字符。
输入描述
输入一个均衡串。
- 字符串的长度:[2, 10000]。
- 给定的字符串均为均衡字符串
输出描述
输出可分割成新的均衡子串的最大个数。
备注
分割后的子串,是原字符串的连续子串
用例1
输入
XXYYXY输出
2说明
XXYYXY可分割为2个均衡子串,分别为:XXYY、XY
题解
思路:逻辑分析
- 题目保证输入的是均衡字符串并且要求分割之后均衡字符串最大,需要分析出一个原理
一个均衡字符串,左边是均衡字符串的情况下,右边部分肯定也是均衡字符串。 - 明白1的原理之后,只需要从前往后遍历输入字符串,当
X的数量 == Y的数量进行一次切割,均衡子串结果+1. - 然后输出得到的切割次数即可。
c++
#include<iostream> #include<vector> #include<string> #include <utility> #include <sstream> #include<algorithm> #include<cmath> #include<map> using namespace std; int main() { string input; getline(cin, input); int res = 0; // 记录xy分别出现次数 vector<int> count(2, 0); for (int i = 0; i < input.size(); i++) { char c = input[i]; count[c - 'X']++; // 达到均衡可以切割一次 if (count[0] == count[1]) { res++; } } cout << res; return 0; }JAVA
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String input = br.readLine(); int res = 0; // 记录 X、Y 分别出现的次数,下标 0 表示 X,1 表示 Y int[] count = new int[2]; for (int i = 0; i < input.length(); i++) { char c = input.charAt(i); count[c - 'X']++; // 达到均衡(X 和 Y 数量相等)即可切割一次 if (count[0] == count[1]) { res++; } } System.out.println(res); } }Python
importsys input_str=sys.stdin.readline().strip()res=0# 记录 X、Y 分别出现的次数count=[0,0]forcininput_str:count[ord(c)-ord('X')]+=1# 达到均衡可以切割一次ifcount[0]==count[1]:res+=1print(res)JavaScript
// 使用 readline 读取标准输入(ACM 模式)constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,output:process.stdout});letinput='';rl.on('line',line=>{input=line.trim();});rl.on('close',()=>{letres=0;// 记录 X、Y 分别出现的次数letcount=[0,0];for(constcofinput){count[c.charCodeAt(0)-'X'.charCodeAt(0)]++;// 达到均衡可以切割一次if(count[0]===count[1]){res++;}}console.log(res);});Go
packagemainimport("bufio""fmt""os")funcmain(){in:=bufio.NewReader(os.Stdin)varinputstringfmt.Fscanln(in,&input)res:=0// 记录 X、Y 分别出现的次数count:=make([]int,2)fori:=0;i<len(input);i++{c:=input[i]count[c-'X']++// 达到均衡可以切割一次ifcount[0]==count[1]{res++}}fmt.Println(res)}