【leetcode40-----查找共用字符】

本文解析了如何通过两种高效算法解决LeetCode题目《Find Common Characters》。第一种使用计数数组和移除字符的方法,第二种利用频率数组统计每个字符出现的最少次数。掌握这些技巧,提高字符串处理能力。
摘要由CSDN通过智能技术生成

查找共用字符

给你一个字符串数组 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] 由小写英文字母组成

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-common-characters
 

题解一:

笔者的题解是:以数组中第一个字符串为标准,对于第一个字符串中的每个字符,分别判断其余字符串中是否包含此字符,但是如果有一个字符串中该字符只出现一次,而其他字符串中该字符都出现两次,结果中该字符会出现两次,结果就会出错。所以,在判断字符串中是否包含字符时,若包含,则将该字符从该字符串中移除,而且若该字符串中包含多个该字符,每次只移除一个,所以就使用到了字符串的split方法,先将该字符串根据该字符分隔,然后再合并,就可以移除该字符。具体代码如下:

class Solution {
    public List<String> commonChars(String[] words) {
        List<String> list=new ArrayList<String>();
        for(int i=0;i<words[0].length();i++){
            String s="";
            s+=words[0].charAt(i);
            boolean flag=true;
            for(int j=1;j<words.length;j++){
                if(!words[j].contains(s)){
                    flag=false;
                    break;
                }else{
                    String[] str=words[j].split(s,2);//将字符串只按照该字符分割一次
                    words[j]=str[0]+str[1];
                }
            }
            if(flag){
                list.add(s);
            }
        }
        return list;
    }
}

题解二:

官解使用了两个数组,因为字符串由小写英文字母组成,所以每个数组的长度是26,数组freq用来存储每个字符串中各个字母的出现次数,数组minfreq用来存储在所有字符串中各个字母出现的最小次数,每遍历一个字符串,两个数组都进行一次更新。最后,按照minfreq数组中每个字母出现的次数,将对应字母存入集合中返回。具体代码如下:

class Solution {
    public List<String> commonChars(String[] words) {
        int[] freq=new int[26];
        int[] minfreq=new int[26];
        List<String> list=new ArrayList<String>();
        Arrays.fill(minfreq,Integer.MAX_VALUE);
        for(String s:words){
            for(int i=0;i<s.length();i++){
                freq[s.charAt(i)-'a']++;
            }
            for(int i=0;i<26;i++){
                minfreq[i]=Math.min(minfreq[i],freq[i]);
            }
            Arrays.fill(freq,0);
        }
        for(int i=0;i<26;i++){
            while(minfreq[i]>0){
                String s="";
                char c=(char)('a'+i);
                s+=c;
                list.add(s);
                minfreq[i]--;
            }
        }
        return list;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值