查找共用字符
给你一个字符串数组 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;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153905.html