题目描述:
有一个字符串数组 words 和一个字符串 chars。假如可以用 chars 中的字母拼写出words 中的某个“单词”(字符串),那么我们就认为你掌握了这个单词。words 的字符仅由 a-z 英文小写字母组成,例如 "abc",chars 由 a-z 英文小写字母和 "?" 组成。其中英文 "?" 表示万能字符,能够在拼写
时当作任意一个英文字母。例如:"?" 可以当作 "a" 等字母。
注意:每次拼写时,chars 中的每个字母和万能字符都只能使用一次。输出词汇表
words 中你掌握的所有单词的个数。没有掌握任何单词,则输出0。
输入描述:
第一行:输入数组 words 的个数,记作N。
第二行 ~ 第N+1行:依次输入数组words的每个字符串元素
第N+2行:输入字符串chars
输出描述:
输出一个整数,表示词汇表 words 中你掌握的单词个数
说明:
1、1 ≤ words.length ≤ 100;
2、1 ≤ words[i].length, chars.length ≤ 100;
3、所有字符串中都仅包含小写英文字母、英文问号;
用例1:
输入
4
cat
bt
hat
tree
atach??
输出
2
说明 : 可以拼写字符串"cat"和"hat"
用例2:
输入
3
hello
world
cloud
welldonehohneyr
输出
2
说明:可以拼写字符串"hello"和"world"
用例3:
输入
3
apple
car
window
welldoneapplec?
输出
1
说明:可以拼写字符串"apple"或“car”
C++源码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
bool canSpell(const string& word, const string& chars) {
vector<int> charCount(26, 0);
int wildcards = 0;
for (char c : chars) {
if (c != '?') {
charCount[c - 'a']++;
}
else {
wildcards++;
}
}
for (char c : word) {
if (c == '?') {
if (wildcards > 0) {
wildcards--;
continue;
}
else {
return false;
}
}
else {
if (--charCount[c - 'a'] < 0) {
return false;
}
}
}
return true;
}
int main() {
int N;
cin >> N;
vector<string> words(N), spelledWords;
for (int i = 0; i < N; ++i) {
cin >> words[i];
}
string chars;
cin >> chars;
for (const auto& word : words) {
if (canSpell(word, chars)) {
spelledWords.push_back(word);
}
}
cout << spelledWords.size() << endl;
system("pause");
return 0;
}