当前位置: 代码迷 >> 综合 >> LeetCode—— 1002 查找常用字符
  详细解决方案

LeetCode—— 1002 查找常用字符

热度:114   发布时间:2023-10-15 14:41:36.0

问题描述

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

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

示例 1:
输入:["bella","label","roller"]
输出:["e","l","l"]示例 2:
输入:["cool","lock","cook"]
输出:["c","o"]提示:1 <= A.length <= 100
1 <= A[i].length <= 100
A[i][j] 是小写字母

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-common-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

执行结果

LeetCode—— 1002 查找常用字符

代码描述

思路:本题可以理解为求每个字符串之间字符数量的交集。对于第一个字符串,用数组 arr_1 记录下每个字符出现的次数,第二个字符串用数组 arr_2 记录下每个字符出现的次数,然后求每个字符的最小值,即交集,保留在数组 arr_1 中,继续用 arr_2 保存后面的字符串的字符,继续取交集。最终arr_1 中,index 表示对应的26个字母,val 为该字母交集的个数,然后输出。需要注意的是:数字->字符->字符串   的过程。时间复杂度O(n),空间复杂度O(1)

class Solution {
public:vector<string> commonChars(vector<string>& A) {int arr_1[26] = {0};int arr_2[26] = {0};int index = 0;for(int j = 0; j < A[0].size(); ++j)    // 处理第一个{index = A[0][j] - 'a';arr_1[index] += 1;}for(int i = 1; i < A.size(); ++i)       // 处理后面的每一个字符串{for(int j = 0; j < A[i].size(); ++j){index = A[i][j] - 'a';arr_2[index] += 1;}for(int k = 0; k < 26; ++k)        // 用arr_1,保留每个字符的交集{arr_1[k] = min(arr_1[k], arr_2[k]);arr_2[k] = 0;}}vector<string> res;char a;string str;for(int i = 0; i < 26; ++i){while(arr_1[i] > 0){    a = (i + 97);        // 下面的几行,将字符变为字符串。\0 可以不添加,为了安全起见,建议添加。str = a+'\0';res.push_back(str);arr_1[i]-=1;}}return res;}
};