返回带有字符[a,b,b,c]的单词

时间:2020-08-04 15:55:37

标签: java hashmap

给出字符串列表["abc", "abcdb", "gggh", "klsrtabcabc", "118*90", "ggggggggggggggggggggggggggggggggg"]

返回包含[a,b,b,c]中所有字母的单词(这意味着单词中至少有'a'一次,'b'两次和'c'一次)

答案:“ abcdb”,“ klsrtabcabc”

这是为此的哈希图算法

  1. 从所需字符列表中构建字符频率图。例如。对于[a,b,b,c],您最终得到{a=1, b=2, c=1}

  2. 迭代字符串列表:

  1. 从字符串中构建字符频率映射。例如。对于“ klsrtabcabc”,您最终得到{a=2, b=2, c=2, k=1, l=1, r=1, s=1, t=1}
  2. 检查字符串是否至少具有所需的字符数。例如。由于a:2> = 1,b:2> = 2,c:2> = 1,所以选择了字符串。
  3. 如果选中,则将字符串添加到结果中。 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);
      }
    }
  }
}

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]);
}
相关问题