PAT乙级1039 || 到底买不买(20)(C++)

读题思考:

题干只问是否全部包含,没有要求顺序。

设两个bool变量,bool each[1000]={false}应用于记录第一个字符串每个字符是否已经被匹到过;bool yon记录是否全部包含。

逐字比较,注意匹配上了的字符bool值置为true防止多个需求计到一个字符上。

用于匹配的代码块思路:

1.全部包含,方法是for循环将str2的每一个字符单拎出来和str1的字符一个个遍历,遇到相同且还没被匹配上的,将str1里的对应字符bool置反;换str2的下一个字符从头开始遍历。str2每个都遍历完之后,输出Yes和num_of_str1 - num_of_str2

2.有缺。设定一个计数变量count,遍历匹配和上面一样,不同在于例如说有一个str2的字符遍历完str1都没匹配到,那就把yon赋值为false,注意是直接赋值,不是取反;同时count++,str2每个都遍历完之后,输出No和count

代码:
#include <iostream>
#include <string>
using namespace std;

int main() {
	//输入
	string str1, str2;
	cin >> str1 >> str2;

	//匹配
    bool each[1000] = { false };//若第i位字符对应的false,表示之前还没有被匹配到过
	bool yon = true;
	int count = 0;
	for (int i = 0; i < str2.length(); i++) {
		for (int j = 0; j < str1.length(); j++) {
			if (j == str1.length()-1 && str1[j] != str2[i]) { //注意j的值要减去1,代码第一遍提交出错就是因为这个小疏忽
				yon = false;
				count++;
			}
			else if (str1[j] == str2[i] && each[j]==false) {
				each[j] = true;
				break;
			} 
		}
	}
	//输出
	if (yon == true) {
		cout << "Yes" << " " << str1.length() - str2.length();
	}
	else {
		cout << "No" << " " << count;
	}

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值