LeetCode1178. 猜字谜

外国友人仿照中国字谜设计了一个英文版猜字谜小游戏,请你来猜猜看吧。

字谜的迷面 puzzle 按字符串形式给出,如果一个单词 word 符合下面两个条件,那么它就可以算作谜底:

单词 word 中包含谜面 puzzle 的第一个字母。
单词 word 中的每一个字母都可以在谜面 puzzle 中找到。
例如,如果字谜的谜面是 “abcdefg”,那么可以作为谜底的单词有 “faced”, “cabbage”, 和 “baggage”;而 “beefed”(不含字母 “a”)以及 “based”(其中的 “s” 没有出现在谜面中)都不能作为谜底。
返回一个答案数组 answer,数组中的每个元素 answer[i] 是在给出的单词列表 words 中可以作为字谜迷面 puzzles[i] 所对应的谜底的单词数目。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-valid-words-for-each-puzzle
输入:
words = [“aaaa”,“asas”,“able”,“ability”,“actt”,“actor”,“access”],
puzzles = [“aboveyz”,“abrodyz”,“abslute”,“absoryz”,“actresz”,“gaswxyz”]
输出:[1,1,3,2,4,0]
解释:

1 个单词可以作为 "aboveyz" 的谜底 : "aaaa" 
1 个单词可以作为 "abrodyz" 的谜底 : "aaaa"
3 个单词可以作为 "abslute" 的谜底 : "aaaa", "asas", "able"
2 个单词可以作为 "absoryz" 的谜底 : "aaaa", "asas"
4 个单词可以作为 "actresz" 的谜底 : "aaaa", "asas", "actt", "access"
没有单词可以作为 "gaswxyz" 的谜底,因为列表中的单词都不含字母 'g'
class Solution {
public:
    vector<int> findNumOfValidWords(vector<string>& words, vector<string>& puzzles) {
	vector<int> cnt;
	int len_w = words.size();
	int len_p = puzzles.size();
	map<int,int>mp;
	map<int,int>::iterator it;
	//排序后去除重复字符串
	for(int j=0; j<len_w; j++) {
		sort(words[j].begin(), words[j].end());  //先对字符串排序;
		string::iterator itend = unique(words[j].begin(),words[j].end());
		//返回出现重复元素的首地址;
		words[j].erase(itend, words[j].end());//删除重复元素;
		if(words[j].size()<=7) {
			int data=0;
			for(int k=0; k<words[j].size(); k++) {
				data+=pow(2,words[j][k]-'a');
			}
			mp[data]++;
		}
	}
	for(int j=0; j<len_p; j++) {
		int data=0;
		int count=0;
		int first_char = puzzles[j][0]-'a';
		for(int k=0; k<puzzles[j].size(); k++) {
			data+=pow(2,puzzles[j][k]-'a');
		}
		data-=pow(2,first_char);
		int substr=data;
		while(data>0) {
			int x=data+pow(2,first_char);
			if(mp[x]>0) {
				count+=mp[x];
			}
			data=(data-1) & substr;
			if(data == 0){
				x=data+pow(2,first_char);
				if(mp[x]>0) {
					count+=mp[x];
				}
			}
		}
		cnt.push_back(count);
	}
	return cnt;
    }
};
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页