916. 单词子集

版权声明:孔庆鑫 https://blog.csdn.net/kongqingxin12/article/details/85770981

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;
	}
};

猜你喜欢

转载自blog.csdn.net/kongqingxin12/article/details/85770981