练习题 替换子串得到平衡字符串

这篇具有很好参考价值的文章主要介绍了练习题 替换子串得到平衡字符串。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

有一个只含有 'Q', 'W', 'E', 'R' 四种字符,且长度为 n 的字符串。

假如在该字符串中,这四个字符都恰好出现 n/4 次,那么它就是一个「平衡字符串」。

给你一个这样的字符串 s,请通过「替换一个子串」的方式,使原字符串 s 变成一个「平衡字符串」。

你可以用和「待替换子串」长度相同的 任何 其他字符串来完成替换。

请返回待替换子串的最小可能长度。

如果原字符串自身就是一个平衡字符串,则返回 0

示例 1:

输入:s = "QWER"
输出:0
解释:s 已经是平衡的了。

示例 2:

输入:s = "QQWE"
输出:1
解释:我们需要把一个 'Q' 替换成 'R',这样得到的 "RQWE" (或 "QRWE") 是平衡的。

示例 3:

输入:s = "QQQW"
输出:2
解释:我们可以把前面的 "QQ" 替换成 "ER"。 

示例 4:

输入:s = "QQQQ"
输出:3
解释:我们可以替换后 3 个 'Q',使 s = "QWER"。

提示:

  • 1 <= s.length <= 10^5
  • s.length 是 4 的倍数
  • s 中只含有 'Q''W''E''R' 四种字符
提交代码 
//替换子串得到平衡字符串 

//只含四种已定字符
//求替换子串的最小长度 
//平衡子串的四种字符的个数都是相等的
//字符串长度确定是4的倍数
//连续一段元素的群体关系
//滑动窗口 
//首先遍历字符串,明确四种字符的个数

#include<iostream>
#include<string>
#include<algorithm>
using namespace std; 

string s;//字符串
int result = (int)(1e5);//结果 
int n;//字符串长度 
int cnt[4];//四种字符的个数
int m = 0;//需要修改的字符的个数 

//判断指针指向的字符是什么
int judge(int p){
	if(s[p] == 'Q'){
		return 0;
	}else if(s[p] == 'W'){
		return 1;
	}else if(s[p] == 'E'){
		return 2;
	}else{
		return 3;
	}
} 

//滑动窗口
void slidingWindow(){
	int left = 0,right = 0;//左右指针
	//int mm = m;//已修改的字符的个数
	int c;//标记是哪种字符
	int res = 0;//记录子串长度 
	int t[4];//各字符个数的副本
	
	//复制字符个数副本
	copy(begin(cnt),end(cnt),begin(t));
	
	//先单独判断第一个字符
	c = judge(left);
	if(cnt[c] > n / 4){
		t[c]--;
		m--;
	} 
	
	//循环尝试固定左指针
	for(;left < n && left <= right;left++){
		//移动右指针 
		while(m > 0 && right < n - 1){
			//还未替换完
			right++;
			//判断新并入的字符是哪一个
			c = judge(right);
			if(t[c] > n / 4){
				//该字符需要替换
				m--;
				t[c]--; 
			}else{
				t[c]--;
			}
		}
		
		//当前替换子串长度
		if(m == 0){
			res = right - left + 1;
			result = min(res,result);
		}else{
			break;
		}
		
		//printf("left=%d,right=%d\n",left,right);	
		
		//排除最左侧的字符
		c = judge(left);
		if(cnt[c] > n / 4){
			//被替换过
			t[c]++;
			m++; 
			
			if(t[c] <= n / 4){
				m = 0;
			}
		}
		
		//printf("m=%d,res=%d\n",m,res);	
	} 
} 

int main(){
	//输入整数数组  
	/*int t; 
	
	while(cin.peek() != '\n'){
		scanf("%d",&t);
		nums1.push_back(t);
	}*/
	
	//输入字符串
	cin >> s; 
	
	//-------------------------------
	
	n = s.size();//字符串长度 
	
	//确认四种字符的个数
	for(int i = 0;i < n;i++){
		if(s[i] == 'Q'){
			cnt[0]++;
		}else if(s[i] == 'W'){
			cnt[1]++;
		}else if(s[i] == 'E'){
			cnt[2]++;
		}else{
			cnt[3]++;
		}
	} 
	
	//确定需要修改的次数
	for(int i = 0;i < 4;i++){
		if(cnt[i] > n / 4){
			m += cnt[i] - n / 4;
		}
	}
	
	if(m == 0 || m == 1){
		//特殊情况
		result = m; 
	}else{
		//一般情况
		//滑动窗口
		slidingWindow(); 
	}
	
	//输出结果
	printf("%d",result);
	
	return 0;
} 
总结

解题思路:替换一个子串其实就是改变一段连续元素的群体关系,故使用滑动窗口(同向双指针)。注意当舍去最左侧元素且该最左侧元素变化了的时候,新生成的子串可能仍成立,因为剩余子串中仍可能含有该元素但是未变。

注意:

        将一个数组的所有元素复制到另一个数组中,可以使用copy(begin(nums1),end(nums1),begin(nums2));文章来源地址https://www.toymoban.com/news/detail-802706.html

到了这里,关于练习题 替换子串得到平衡字符串的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 循环结构(含练习题)

    当循环次数或范围确定时,多用for循环,反之多用while循环 循环结构一般由四部分组成: 初始化语句,在循环开始最初执行,并且只执行一次 条件判断、步进语句、循环体 for循环,循环体可以执行零次或多次 每执行一次循环体,就会执行一次步进语句 foreach循环,JDK 5 新特

    2024年02月19日
    浏览(38)
  • 树状数组练习题

    为什么大佬们一眼看出是树状数组呢? 不是一眼看出树状数组,而是 要把 【找两个相邻的最小值之间还有几个数没删掉】 的问题转变成动态区间和问题,这个转化过程才是最重要的 , 至于你用什么数据结构求动态区间和是次要的,很多数据结构都能做,最常用的树状数组

    2024年02月03日
    浏览(39)
  • python文件练习题

    【问题描述】 从一个文本文件内读入任意多个学生的分数,求出最高分,最低分和平均分存入文件result.txt内。 【输入形式】 一个文件,文件中分数之间由换行隔开,输入的文件名为grade.txt。输入的分数都是整数。 【输出形式】 计算出grade.txt中所有分数的最高分,最低分和

    2024年02月03日
    浏览(44)
  • 蓝桥杯练习题(三)

    本文主要是【算法】——蓝桥杯练习题(三)的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日一句:狠狠沉淀,顶峰相见

    2024年01月15日
    浏览(45)
  • spark考试(练习题)

    点击下载练习题word文档! 点击下载RDD编程笔记! 编程题: 1.(1.5分)单选题 1.5 下列选项中,哪个不属于消息系统()。 A Kafka B RabbitMQ C ActiveMQ D Zookeeper 参考答案: D 解析: 无 2.(1.5分)单选题 1.5 下列选项中,说法正确的是() A 批处理时间间隔必须是窗口滑动时间间隔的整数倍

    2024年02月05日
    浏览(40)
  • 练习题----顺序栈算法

    ​输入一个包括 \\\'(\\\' 和 \\\')\\\' 的字符串string ,判断字符串是否有效。要求设计算法实现检查字符串是否有效,有效的字符串需满足以下条件: A. 左括号必须用相同类型的右括号闭合。 B. 左括号必须以正确的顺序闭合。 C. 每个右括号都有一个对应的相同类型的左括号。 ​该题需

    2024年04月26日
    浏览(42)
  • 集合的练习题

    练习1:随机点名器 需求:班级里有N个学生,实现随机点名器 练习2:带概率的随机 需求: ​ 班级里有N个学生 ​ 要求在随机的时候,70%的概率随机到男生,30%的概率随机到女生 练习3:随机不重复 需求: ​ 班级里有 N 个学生,被点到的学生不会再被点到。但是如果班级中

    2024年02月09日
    浏览(35)
  • C# 练习题

    26.   Enum(枚举) 27.class(类定义) 28.成员函数和封装 29.C#构造函数 30. 参数化构造函数 31.C# 析构函数  32.静态函数static 33. C# 继承   @学习来源于www.runoob.com

    2024年02月09日
    浏览(38)
  • java -- 练习题

    1.定义一个Person类,要求有姓名和年龄,并且符合JavaBean标准,定义Student类继承Person,定义测试类,创建Student对象,要求创建Student对象的同时,指定Student对象的姓名为\\\"张三\\\",只能指定姓名不许指定年龄 2.按照以下要求定义类 3.键盘录入一个字符串,判断这个字符串是否是对称的字符串

    2023年04月09日
    浏览(36)
  • Java 练习题

    台式机,安卓手机,iPhone手机,他们其实都是计算机,计算机干的事情就是严格的执行人的指令,但是目前的科技条件下,电脑仍然有一个很大的短板,这个短板是? A 思考 B 计算 答案:A 计算机不能思考,那他是如何工作的呢,下面的描述哪个是对的? A 等待人工智能的进

    2024年02月03日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包