查找共用字符-力扣

1002. 查找共用字符

简单

335

相关企业

给你一个字符串数组 words ,请你找出所有在 words 的每个字符串中都出现的共用字符( 包括重复字符),并以数组形式返回。你可以按 任意顺序 返回答案。

示例 1:

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

示例 2:

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

提示:

  • 1 <= words.length <= 100
  • 1 <= words[i].length <= 100
  • words[i] 由小写英文字母组成

通过次数

84.6K

提交次数

119.5K

通过率

70.8%


请问您在哪类招聘中遇到此题?

1/5

社招

校招

实习

未遇到


相似题目


相关标签


贡献者

© 2023 领扣网络(上海)有限公司

 

时间8 ms

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
char ** commonChars(char ** words, int wordsSize, int* returnSize){
    //出现相同的字符且数目相同
    //尝试使用哈希表
    int minfreq[26],freq[26];
    //minfreq[c] 存储字符 ccc 在所有字符串中出现次数的最小值
    //freq[c] 统计 sss 中每一个字符 ccc 出现的次数
    for(int i=0;i<26;i++){
        minfreq[i]=INT_MAX;
        //将每一个 minfreq[c]\textit{minfreq}[c]minfreq[c] 更新为其本身与 freq[c]\textit{freq}[c]freq[c] 的较小值
        freq[i]=0;
    }
    for(int i=0;i<wordsSize;i++){
        memset(freq,0,sizeof(freq));
        int n=strlen(words[i]);
        for(int j=0;j<n;j++){
            ++freq[words[i][j]-'a'];
        }
        for(int j=0;j<26;j++){
            minfreq[j]=fmin(minfreq[j],freq[j]);
        }
    }
    int sum=0;
    for(int i=0;i<26;i++){
        sum+=minfreq[i];
    }    

    char**ans=malloc(sizeof(char*)*sum);
    *returnSize=0;
    for(int i=0;i<26;i++){
        for(int j=0;j<minfreq[i];j++){
            ans[*returnSize]=malloc(sizeof(char)*2);
            ans[*returnSize][0] = i + 'a';
            ans[*returnSize][1] = 0;
            (*returnSize)++; 
        }
    }
    return ans;
}

4 ms 的代码示例

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
char ** commonChars(char ** words, int wordsSize, int* returnSize){
    if(words==NULL||wordsSize==0){
        (*returnSize)=0;
        return NULL;
    }
    int res[100][26] = {0};
    char **rslt = malloc(sizeof(char*)*100);

    int i,j;
    for(i=0;i<100;i++){
        rslt[i]=malloc(sizeof(char)*2);
    }
    for(i=0;i<wordsSize;i++){
        for(j=0;j<strlen(words[i]);j++){
            res[i][words[i][j]-'a']++;
        }
    }
    int dex = 0;
    for(i=0;i<26;i++){
        int min =res[0][i];
        for(j=1;j<wordsSize;j++){
            if(res[j][i]<min){min = res[j][i];}
        }
    while(min>0){
        rslt[dex][0]=i+'a';
        rslt[dex][1]='\0';
        dex++;
        min--;
    }
    }
    (*returnSize)=dex;
    return rslt;
}

0 ms 的代码示例

char** commonChars(char** words, int wordsSize, int* returnSize) {
    int minfreq[26], freq[26];
    for (int i = 0; i < 26; ++i) {
        minfreq[i] = INT_MAX;
        freq[i] = 0;
    }
    for (int i = 0; i < wordsSize; ++i) {
        memset(freq, 0, sizeof(freq));
        int n = strlen(words[i]);
        for (int j = 0; j < n; ++j) {
            ++freq[words[i][j] - 'a'];
        }
        for (int j = 0; j < 26; ++j) {
            minfreq[j] = fmin(minfreq[j], freq[j]);
        }
    }

    int sum = 0;
    for (int i = 0; i < 26; ++i) {
        sum += minfreq[i];
    }

    char** ans = malloc(sizeof(char*) * sum);
    *returnSize = 0;
    for (int i = 0; i < 26; ++i) {
        for (int j = 0; j < minfreq[i]; ++j) {
            ans[*returnSize] = malloc(sizeof(char) * 2);
            ans[*returnSize][0] = i + 'a';
            ans[*returnSize][1] = 0;
            (*returnSize)++;
        }
    }
    return ans;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值