leetcode-1002:查找常用字符

简介: leetcode-1002:查找常用字符

题目

题目链接

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

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

示例 1:

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

示例 2:

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

解题

用minfreq记录每个字符出现的最小频率

tmp记录当前字符串中每个字符的频率,然后用来更新minfreq

python解法

class Solution:
    def commonChars(self, words: List[str]) -> List[str]:
        minfreq = [float('inf')]*26
        for word in words:
            tmp = [0]*26
            for c in word:
                tmp[ord(c)-ord('a')]+=1
            for i in range(26):
                minfreq[i] = min(minfreq[i],tmp[i])
        res = []
        for i in range(26):
            res.extend([chr(i+ord('a'))]*minfreq[i])
        return res

c++解法

class Solution {
public:
    vector<string> commonChars(vector<string>& words) {
        vector<int> minfreq(26,INT_MAX);
        for(string word:words){
            vector<int> tmp(26,0);
            for(char c:word){
                tmp[c-'a']++;
            }
            for(int i=0;i<26;i++){
                minfreq[i]=min(minfreq[i],tmp[i]);
            }
        }
        vector<string> res;
        for (int i = 0; i < 26; ++i) {
            for (int j = 0; j < minfreq[i]; ++j) {
                res.emplace_back(1, i + 'a');
            }
        }
        return res;
    }
};

emplace_back和push_back差别

res.emplace_back(1, i + 'a');

如果使用push_back就要

res.push_back(string(1,i+'a'));

在push_back之前,实例对象就必须要执行构造函数,然后拷贝到容器中再执行一次拷贝构造函数

但是使用emplace_back以不用执行多余的拷贝构造函数了,它是直接在容器内执行对象的构造。

string

string(1,i+'a')代表添加1个(i+‘a’)

可以看到 此题的要求返回["e","l","l"]这种,双引号代表string,每个string只能有一个字符

于是并不能使用res.emplace_back(minfreq[i],i+'a')

其他补充:

.C++string字符串类(详解)

java解法

class Solution {
    public List<String> commonChars(String[] words) {
        List<String> res=new ArrayList<>();
        if(words.length==0) return res;
        int[] mp=new int[26];
        for(int i=0;i<words[0].length();i++){
            mp[words[0].charAt(i)-'a']++;
        }
        for(int i=1;i<words.length;i++){
            int[] tmp=new int[26];
            String s=words[i];
            for(int j=0;j<s.length();j++){
                tmp[s.charAt(j)-'a']++;
            }
            for(int j=0;j<26;j++){
                mp[j]=Math.min(mp[j],tmp[j]);
            }
        }
        for(int i=0;i<26;i++){
            for(int j=0;j<mp[i];j++){
                char c=(char)(i+'a');
                res.add(String.valueOf(c));
            }
        }
        return res;
    }
}


相关文章
|
6月前
|
存储 算法 程序员
【Leetcode 程序员面试金典 01.01】判定字符是否唯一 —— 位运算|哈希表
可以使用哈希表或位运算来解决此问题:由题可知s[i]仅包含小写字母,int[26]即能表示字符的出现次数;
|
1月前
|
存储 算法
Leetcode第三题(无重复字符的最长子串)
这篇文章介绍了解决LeetCode第三题“无重复字符的最长子串”的算法,使用滑动窗口技术来找出给定字符串中最长的不含重复字符的子串,并提供了详细的代码实现和解释。
65 0
Leetcode第三题(无重复字符的最长子串)
|
3月前
|
算法
LeetCode第3题无重复字符的最长子串
该文章介绍了 LeetCode 第 3 题无重复字符的最长子串的解法,通过使用 HashSet 记录不重复的子元素,以每个字符开头遍历字符串,遇到重复字符则重新计算,最终找到最长子串,同时提到可以考虑使用 HashMap 降低复杂度。
LeetCode第3题无重复字符的最长子串
|
5月前
|
存储 算法 数据可视化
深入解析力扣161题:相隔为 1 的编辑距离(逐字符比较与动态规划详解)
深入解析力扣161题:相隔为 1 的编辑距离(逐字符比较与动态规划详解)
|
5月前
|
存储 算法 数据可视化
深入解析力扣157题:用Read4高效读取N个字符(多种解法与详细图解)
深入解析力扣157题:用Read4高效读取N个字符(多种解法与详细图解)
|
4月前
|
索引
821.字符的最短距离-力扣(LeetCode)
821.字符的最短距离-力扣(LeetCode)
33 0
|
5月前
|
存储 算法 程序员
力扣经典150题第三十一题:无重复字符的最长子串
力扣经典150题第三十一题:无重复字符的最长子串
31 0
|
5月前
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
|
5月前
|
存储 算法 数据可视化
深入解析力扣159题:至多包含两个不同字符的最长子串(滑动窗口法详细图解)
深入解析力扣159题:至多包含两个不同字符的最长子串(滑动窗口法详细图解)
|
5月前
|
存储 算法 数据挖掘
LeetCode 第三题:无重复字符的最长子串 详解 【3/1000】
LeetCode 第三题:无重复字符的最长子串 详解 【3/1000】