#P1095. 2023.03.19-第二题-子序列
-
1000ms
Tried: 810
Accepted: 286
Difficulty: 6
所属公司 :
米哈游
时间 :2023年3月19日
-
算法标签>思维
2023.03.19-第二题-子序列
题目思路
思维。
观察到在题目给定的两个操作下,,m,h,y 三个字符的顺序没有什么影响。即任意一组无序的mhy可以通过两种操作下变成另外一种。(是的,大家可以自己手玩一下,尝试将mhy通过先增后删的方式转变为yhm)
所以我们只需要判断两个字符串的m,h,y的个数是否都相同,且去掉这三个字符后的字符串是否相同即可。
代码
C++
#include <bits/stdc++.h>
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;
}
Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt();
while (T-- > 0) {
int[] bin_s = new int[3];
int[] bin_t = new int[3];
String s = scanner.next();
String t = scanner.next();
StringBuilder new_s = new StringBuilder();
StringBuilder new_t = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
switch (s.charAt(i)) {
case 'm':
bin_s[0]++;
break;
case 'h':
bin_s[1]++;
break;
case 'y':
bin_s[2]++;
break;
default:
new_s.append(s.charAt(i));
break;
}
}
for (int i = 0; i < t.length(); i++) {
switch (t.charAt(i)) {
case 'm':
bin_t[0]++;
break;
case 'h':
bin_t[1]++;
break;
case 'y':
bin_t[2]++;
break;
default:
new_t.append(t.charAt(i));
break;
}
}
if (new_s.toString().equals(new_t.toString())) {
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]) {
System.out.println("Yes");
} else {
System.out.println("No");
}
} else {
System.out.println("No");
}
}
}
}
python
T = int(input())
for _ in range(T):
bin_s = [0, 0, 0]
bin_t = [0, 0, 0]
s = input()
t = input()
new_s = ''
new_t = ''
for char in s:
if char == 'm':
bin_s[0] += 1
elif char == 'h':
bin_s[1] += 1
elif char == 'y':
bin_s[2] += 1
else:
new_s += char
for char in t:
if char == 'm':
bin_t[0] += 1
elif char == 'h':
bin_t[1] += 1
elif char == 'y':
bin_t[2] += 1
else:
new_t += char
if new_s == new_t:
if bin_s[0] - bin_t[0] == bin_s[1] - bin_t[1] and bin_s[0] - bin_t[0] == bin_s[2] - bin_t[2]:
print("Yes")
else:
print("No")
else:
print("No")
题目内容
米小游是一名研究生,正在研究一种基于字符串操作的算法。他最近接到了一个字符串操作的任务,需要将给定的字符串 s 转化为目标字符串 t 。然而,他发现这个任务并不是一件简单的事情。因为他只能进行两种操作:删除 s 中的一个子序列 "mhy" ,或在 s 中添加一个子序列 "mhy" 。
例如,给定 s 为 "mhbdy" ,米小游进行一次操作后可以使 s 变成 "bd" ,或者变成 "mhmbhdyy" 。
米小游想知道,经过若干次操作后 s 是否可以变成 t ?
注:子序列在原串中的顺序也是从左到右,但可以不连续。
输入描述
第一行输入一个正整数 q ,代表询问的次数。
接下来每两行为一次询问:每行均为一个字符串,分别代表 s 和 t 。
1≤q≤103
字符串的长度均不超过 103 。
输出描述
输出 q 行,每行输入一行答案。若可以使 s 变成 t ,则输出 "Yes" 。否则输出 "No" 。
样例
输入
3
mhbdy
bd
mhbdy
mhmbhdyy
mhy
abc
输出
Yes
Yes
No