2023.9.6
个人感觉这题难度不止简单,考察到的东西还是挺多的。 首先理解题意,可以将题意转化为:求字符串数组中 各字符串共同出现的字符的最小值。 分为三步做:
- 构造一个哈希表hash,初始化第一个字符串的字母出现频率。
- 再构造一个哈希表other_hash,用来依次统计后面的字符串中每个字符出现的频率,每个字符串统计完之后和上一个哈希表对比,取频率小的那个值。
-
遍历第一个hash表将频率大于0的字符放入ans中。
代码如下:文章来源:https://www.toymoban.com/news/detail-698504.html
class Solution {
public:
vector<string> commonChars(vector<string>& words) {
//本题可以简化为求数组中各字符串共同出现的字符的最小值
vector<string> ans;
int hash[26] = {0};
//初始化第一个字符串的字母出现频率
for(int i=0; i<words[0].size(); i++)
{
hash[words[0][i]-'a'] += 1;
}
int other_hash[26] = {0};
//每个字符串都统计出频率,并和第一个字符串的频率比较,取小的那一个。
for(int i=1; i<words.size(); i++)
{
memset(other_hash , 0 , 26*(sizeof(int))); //重新初始化other_hash数组为全0
for(int j=0; j<words[i].size(); j++)
{
other_hash[words[i][j]-'a'] += 1;
}
for(int k=0; k<26; k++)
{
hash[k] = min(hash[k] , other_hash[k]);
}
}
//遍历hash将频率大于0的字符放入ans中
for(int i=0; i<26; i++)
{
string s(1 , 'a'+i);
while(hash[i]--) ans.push_back(s);
}
return ans;
}
};
ps:有几个点注意下:文章来源地址https://www.toymoban.com/news/detail-698504.html
- memset函数: void *memset(void *str, int c, size_t n) ,用于复制字符 c 到参数 str 所指向的字符串的前 n 个字符,最后一个参数是这n个字符占的内存大小。 本题用于将other_hash表重新初始化为全0值。
- string s(1 , 'a'+i): 在结尾遍历hash函数的时候,需要将数字转化为对应的字母,如:0对应a,1对应b。 这里string的用法为:第一个参数代表要创建一个包含一个字符的字符串,第二个参数代表这个字符的值由整数i加上字符
'a'
的ASCII码值决定。
到了这里,关于leetcode 1002. 查找共用字符的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!