题目
有一个字符串数组 words 和一个字符串 chars。
假如可以用 chars 中的字母拼写出 words 中的某个“单词”(字符串),那么我们就认为你掌握了这个单词。
words 的字符仅由 a-z 英文小写字母组成,例如 "abc"
chars 由 a-z 英文小写字母和 "?" 组成。其中英文 "?" 表示万能字符,能够在拼写时当作任意一个英文字母。例如:"?" 可以当作 "a" 等字母。
注意:每次拼写时,chars 中的每个字母和万能字符都只能使用一次。
输出词汇表 words 中你掌握的所有单词的个数。没有掌握任何单词,则输出0。
题目输入
第一行:输入数组 words 的个数,记作N。
第二行 ~ 第N+1行:依次输入数组words的每个字符串元素
第N+2行:输入字符串chars
题目输出
输出一个整数,表示词汇表 words 中你掌握的单词个数
实例
输入 | 4 cat bt hat tree atach?? |
输出 | 3 |
说明 | 可以拼写字符串"cat"、"bt"和"hat" |
输入 | 3 hello world cloud welldonehohneyr |
输出 | 2 |
说明 | 可以拼写字符串"hello"和"world" |
输入 | 3 apple car window welldoneapplec? |
输出 | 2 |
说明 | 可以拼写字符串"apple"和“car” |
题目解析
题目
题目代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int n;
cin >> n;// 大小
vector<string> nums(n);
for(int i = 0; i < n; i++){
cin >> nums[i];// vector字符串
}
string str;
cin >> str;// 字符串
vector<int> record(26, 0);
int ask = 0;// 统计?个数
for(int i = 0; i < str.size(); i++){
if(str[i] == '?'){
ask++;
}else{
record[str[i] - 'a']++;
}
}
int result = 0;
for(auto nu:nums){
vector<int> recordCopy;
recordCopy = record;
int count = 0;
for(int i = 0; i < nu.size(); i++){
if((--recordCopy[nu[i] - 'a']) < 0){// 必须是--**,因为要先减完以后再使用。
count++;
}
}
// 可以使用下列方式统计个数
// int count = 0;
// for(int i = 0; i < 26; i++){
// if(recordCopy[i] < 0){
// count += -1*recordCopy[i];
// }
// }
if(count > ask){
continue;
}
result++;
}
cout << result << endl;
return 0;
}