916. 单词子集

916. 单词子集
执行时间408ms

class Solution {
public:
	vector<string> wordSubsets(vector<string>& A, vector<string>& B) {
		vector<string>ans;
		//转换数组A,B的存储方式
		vector<map<char, int>> a, b;
		for (int l = 0; l < A.size(); ++l) {
			map<char, int>tmp;
			for (int i = 0; i < A[l].length(); ++i) {
				tmp[A[l][i]]++;
			}
			a.push_back(tmp);
		}
		map<char, int>sample;
		for (int k = 0; k < B.size(); ++k) {
			map<char, int> tmp;
			int numbers = 1;
			sort(B[k].begin(), B[k].end());
			for (int i = 0; i < B[k].length(); ++i) {
				if (B[k][i] != B[k][i + 1])
				{
					if (sample[B[k][i]] == 0)
						sample[B[k][i]] = numbers;
					else
						sample[B[k][i]] = max(sample[B[k][i]], numbers);
					numbers = 1;
				}
				else
					numbers++;
			}
		}
		//开始处理
		for (int j = 0; j < a.size(); ++j) {
			if (check(a[j], sample))
				ans.push_back(A[j]);
		}
		return ans;
	}
	bool check(map<char, int>target, map<char, int>sample)
	{
		for (auto i = sample.begin(); i != sample.end(); ++i) {
			pair<char, int>tmp = *i;
			if (target[tmp.first] < tmp.second || target[tmp.first] == 0)
				return false;
		}
		return true;
	}
};

执行时间208ms

class Solution {
public:
	vector<string> wordSubsets(vector<string>& A, vector<string>& B) {
		vector<string>ans;
		//整合数组B里每个字母的数量要求
		map<char, int>sample;
		for (int k = 0; k < B.size(); ++k) {
			map<char, int> tmp;
			int numbers = 1;
			sort(B[k].begin(), B[k].end());
			for (int i = 0; i < B[k].length(); ++i) {
				if (B[k][i] != B[k][i + 1])
				{
					if (sample[B[k][i]] == 0)
						sample[B[k][i]] = numbers;
					else
						sample[B[k][i]] = max(sample[B[k][i]], numbers);
					numbers = 1;
				}
				else
					numbers++;
			}
		}
		//开始处理
		for (int j = 0; j < A.size(); ++j) {
			if (check(A[j], sample))
				ans.push_back(A[j]);
		}
		return ans;
	}
	bool check(string target, map<char, int>sample)
	{
		map<char, int>count;
		sort(target.begin(), target.end());
		for (auto i = sample.begin(); i != sample.end(); ++i) {
			pair<char, int>tmp = *i;
			if (target.find(tmp.first) == string::npos)
				return false;
			else
			{
				auto pos_left = target.find(tmp.first);
				auto pos_right = target.rfind(tmp.first);
				if (pos_right - pos_left + 1 < tmp.second)
					return false;
			}
		}
		return true;
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值