读题思考:
题干只问是否全部包含,没有要求顺序。
设两个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;
}