【备战秋招】每日一题:2023.03.19-米哈游(第二题)--构造数组

为了更好的阅读体检,可以查看我的算法学习网
本题在线评测链接:P1092

题目内容

塔子哥是一名研究生,正在研究一种基于字符串操作的算法。他最近接到了一个字符串操作的任务,需要将给定的字符串 s 转化为目标字符串 t 。然而,他发现这个任务并不是一件简单的事情。因为他只能进行两种操作:删除 s 中的一个子序列 "mhy" ,或在 s 中添加一个子序列 "mhy"

例如,给定 s"mhbdy" ,塔子哥进行一次操作后可以使 s 变成 "bd" ,或者变成 "mhmbhdyy"

塔子哥想知道,经过若干次操作后 s 是否可以变成 t

注:子序列在原串中的顺序也是从左到右,但可以不连续。

输入描述

第一行输入一个正整数 q q q ,代表询问的次数。

接下来每两行为一次询问:每行均为一个字符串,分别代表 st

1 ≤ q ≤ 1 0 3 1\le q\le 10^3 1q103

字符串的长度均不超过 1 0 3 10^3 103

输出描述

输出 q 行,每行输入一行答案。若可以使 s 变成 t ,则输出 "Yes" 。否则输出 "No"

样例

输入

3
mhbdy
bd
mhbdy
mhmbhdyy
mhy
abc

输出

Yes
Yes
No

题目思路

思维。

​ 观察到在题目给定的两个操作下, m , h , y m,h,y m,h,y 三个字符的顺序没有什么影响。即任意一组无序的 m h y mhy mhy可以通过两种操作下变成另外一种。(是的,大家可以自己手玩一下,尝试将 m h y mhy mhy通过先增后删的方式转变为 y h m yhm yhm)

​ 所以我们只需要判断两个字符串的 m , h , y m,h,y m,h,y的个数是否都相同,且去掉这三个字符后的字符串是否相同即可。

代码

C++

#include 

using namespace std;

int bin_s[3], bin_t[3];

int main() {
	int T;
	cin >> T;
	while(T--) {
		bin_s[0] = bin_s[1] = bin_s[2] = 0;
		bin_t[0] = bin_t[1] = bin_t[2] = 0;
		string s, t;
		cin >> s >> t;
		string new_s, new_t;
		for(int i = 0; i < (int) s.length(); i++) {
			if(s[i] == 'm') bin_s[0]++;
			else if(s[i] == 'h') bin_s[1]++;
			else if(s[i] == 'y') bin_s[2]++;
			else new_s.push_back(s[i]);
		}
		for(int i = 0; i < (int) t.length(); i++) {
			if(t[i] == 'm') bin_t[0]++;
			else if(t[i] == 'h') bin_t[1]++;
			else if(t[i] == 'y') bin_t[2]++;
			else new_t.push_back(t[i]);
		}
		if(new_s == new_t) {
			if(bin_s[0] - bin_t[0] == bin_s[1] - bin_t[1]
			&& bin_s[0] - bin_t[0] == bin_s[2] - bin_t[2])
				cout << "Yes" << endl;
			else cout << "No" << endl;
		}
		else cout << "No" << endl;
	}
	return 0;
}

你可能感兴趣的:(算法,华为,数据结构,开发语言,c++)