#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