给出字符串列表["abc", "abcdb", "gggh", "klsrtabcabc", "118*90", "ggggggggggggggggggggggggggggggggg"]
返回包含[a,b,b,c]
中所有字母的单词(这意味着单词中至少有'a'一次,'b'两次和'c'一次)
答案:“ abcdb”,“ klsrtabcabc”
这是为此的哈希图算法
从所需字符列表中构建字符频率图。例如。对于[a,b,b,c]
,您最终得到{a=1, b=2, c=1}
迭代字符串列表:
- 从字符串中构建字符频率映射。例如。对于“ klsrtabcabc”,您最终得到
{a=2, b=2, c=2, k=1, l=1, r=1, s=1, t=1}
- 检查字符串是否至少具有所需的字符数。例如。由于a:2> = 1,b:2> = 2,c:2> = 1,所以选择了字符串。
- 如果选中,则将字符串添加到结果中。 3.返回结果列表。
我将第一步转换为如下所示的Java代码,有人可以帮助我进行步骤2和3吗?
package JavaInterview;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class practice {
public static void main(String[] args) {
String str1="abbc";
//1. Build a character frequency map from the list of required characters.
Map<Character,Integer> hm=new LinkedHashMap<Character,Integer>();
for(Character c : str1.toCharArray()) {
if(hm.containsKey(c)) {
hm.put(c, hm.get(c)+1);
}
else {
hm.put(c, 1);
}
}
}
}
答案 0 :(得分:1)
理想情况下,当您遇到问题而又找不到答案时,应该尝试执行步骤2和3,然后进入SO。现在,我将为您提供方法-只是一个伪代码:
for(int i=0;i<arr.length;i++)
{
Map<Character,Integer> temp = hm;
for(Character c : arr[i].toCharArray())
{
if(!temp.containsKey(c) or temp[c]<=0)
break the loop;
else
temp[c]--;
}
if(end of arr[i] charArray)
answer.add(arr[i]);
}