力扣1002. 查找常用字符(哈希)

力扣1002. 查找常用字符(哈希)

https://leetcode-cn.com/problems/find-common-characters/

给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。

你可以按任意顺序返回答案。

示例 1:

输入:["bella","label","roller"]
输出:["e","l","l"]

示例 2:

输入:["cool","lock","cook"]
输出:["c","o"]

哈希map

【注意】没有char类型直接初始化string的

复杂度分析

  • 时间复杂度:O(n(m+∣Σ∣)),其中 n 是数组 A 的长度(即字符串的数目),m 是字符串的平均长度,aΣ 为字符集,在本题中字符集为所有小写字母,∣Σ∣=26。

    遍历所有字符串并计算 freq 的时间复杂度为 O(nm);
    使用 freq 更新 minfreq 的时间复杂度为 O(n∣Σ∣);
    由于最终答案包含的字符个数不会超过最短的字符串长度,因此构造最终答案的时间复杂度为 O(m+∣Σ∣)。这一项在渐进意义上小于前二者,可以忽略。

  • 空间复杂度:O(∣Σ∣),这里只计算存储答案之外的空间。我们使用了数组 freq 和 minfreq,它们的长度均为 ∣Σ∣。

    扫描二维码关注公众号,回复: 11944608 查看本文章
#include "stdafx.h"
#include<vector>
#include<iostream>
#include<string>
#include<map>
using namespace std;
class Solution {
public:
	vector<string>commonChars(vector<string>&A)
	{
		vector<string> result;
		if (A.size() == NULL) return result;
		map<string, int> mp;
		for (int i = 0; i < A.size(); i++)
		{
			string B;
			B = A[i];
			for (int i = 0; i < B.size(); i++)
			{
				string temp;
				temp = B[i];
				mp[temp]++;
			}
		}
		//iterator
		for (map<string, int>::iterator i = mp.begin(); i != mp.end(); i++)
		{
			while (i->second >= 3 && i->second != 4)
			{
				result.push_back(i->first);
				i->second = i->second - 3;
			}
		}
		return result;
	}
};

int main()
{
	Solution s;
	vector<string>A;
	A.push_back("acabcddd");
	A.push_back("bcbdbcbd");
	A.push_back("baddbadb");
	A.push_back("cbdddcac");
	A.push_back("aacbcccd");
	A.push_back("ccccddda");
	A.push_back("cababaab");
	A.push_back("addcaccd");
	auto result = s.commonChars(A);
	for (int i = 0; i < result.size(); i++)
	{
		cout << result[i] << " ";
	}
	return 0;
}
class Solution {
public:
    vector<string> commonChars(vector<string>& A) {
        vector<string> ans;
        map<char,int>b,c;
        for(int i=0;i<A.size();i++){
            for(int j=0;j<A[i].size();j++){
                b[A[i][j]]++;
                //cout<<b[A[i][j]]<<" %";
            }
            //cout<<endl;

            for(int j=0;j<A[0].size();j++){ //相同字符中选出现最小的
                if(!i){ //初始化c
                    c=b;
                }
                else{
                    if(c[A[i][j]]&&b[A[i][j]]){
                        c[A[i][j]]=min(c[A[i][j]],b[A[i][j]]);
                        //cout<<A[i][j]<<" "<<c[A[i][j]]<<" $";
                    }
                    // else{
                    //     c[A[i][j]]=0;
                    // }
                }
            }
            for(map<char,int>::iterator it=c.begin();it!=c.end();it++){ //不同字符则值置为0
                if(!b[it->first]){
                    it->second=0;
                }
            }
            b.clear();  //重置待比较的
        }
        for(map<char,int>::iterator it=c.begin();it!=c.end();it++){
           while(it->second){
                string s(1,it->first);  //【注意】没有char类型直接初始化string的
                ans.push_back(s);
                it->second--;
            }
            //cout<<it->first<<" "<<it->second;
        }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_35683407/article/details/109067093
今日推荐