题目来源:链接: [https://leetcode-cn.com/problems/find-common-characters/].
1002. 查找常用字符
1.问题描述
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。
你可以按任意顺序返回答案。
示例1:
输入:["bella","label","roller"]
输出:["e","l","l"]
示例2:
输入:["cool","lock","cook"]
输出:["c","o"]
注意:
1. 1 <= A.length <= 100
2. 1 <= A[i].length <= 100
3. A[i][j] 是小写字母
2.我的解决方案
easy 类型题目
利用 空间 换取 时间。
1.首先 计算每个字符串中 每个字母 出现的频率。
2.分别 计算 26个字母在 每个 字符串 中出现的频率,取最小的那个。
3. 存入容器中,以此打印
暴力法代码如下:
class Solution {
public:
vector<string> commonChars(vector<string>& A) {
int vec[A.size()][26] = {0};
for(int i = 0; i < A.size(); ++i)
{
for(int j = 0; j < A[i].size(); ++j)
{
++vec[i][A[i][j] - 'a']; //计算每个字母出现的频率,并存入对应的下标
}
}
vector<string> res;
for(int j = 0; j < 26; ++j)
{
int maxCount = INT_MAX;
for(int i = 0; i < A.size(); ++i)
{
//分别 计算 26个字母在 每个 字符串 中出现的频率,取最小的那个。
maxCount = min(maxCount, vec[i][j]);
}
char t = j + 'a';
char buffer[2] = {t};
while(maxCount--)
{
res.push_back(buffer);
//res.emplace_back(string(buffer));
}
}
return res;
}
};
3.大神们的解决方案
利用 hash_map 容器。
代码如下:
class Solution {
public:
vector<string> commonChars(vector<string>& A) {
vector<unordered_map<int,int>>v;
vector<string>s;
for(int i=0;i<A.size();i++)
{
unordered_map<int,int>m;
for(auto a:A[i])
++m[a];
v.push_back(m);
}
for(int i=0;i<A[0].size();i++)
{
int c=0;
for(int j=0;j<v.size();j++)
{
if(v[j][A[0][i]]>0)
{
c++;
v[j][A[0][i]]--;
}
}
c=c/v.size();
if(c)
{
string str;
str.push_back(A[0][i]);
s.push_back(str);
}
}
return s;
}
};
4.我的收获
INT_MIN 在标准头文件 limits.h 中定义。
#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX - 1)
在C/C++语言中,不能够直接使用-2147483648来代替最小负数,因为这不是一个数字,而是一个表达式。表达式的意思是对整数21473648取负,但是2147483648已经溢出了int的上限,所以定义为(-INT_MAX -1)。
C中int类型是32位的,范围是-2147483648到2147483647 。
(1)最轻微的上溢是INT_MAX + 1 :结果是 INT_MIN;
(2)最严重的上溢是INT_MAX + INT_MAX :结果是-2;
(3)最轻微的下溢是INT_MIN - 1:结果是是INT_MAX;
(4)最严重的下溢是INT_MIN + INT_MIN:结果是0 。
2019/3/31 胡云层 于南京 40