给定单词字典和数组字母,找到可以使用这些字母创建的字典单词的最大数量

时间:2018-06-05 22:14:22

标签: algorithm

每个字母只能使用一次。数组中可能有多个相同字母的实例。

我们可以假设dict中的每个单词都可以使用字母拼写。目标是返回最大字数。

示例1:

arr = ['a', 'b', 'z', 'z', 'z', 'z']
dict = ['ab', 'azz', 'bzz']
// returns 2 ( for [ 'azz', 'bzz' ])

示例2:

arr = ['g', 't', 'o', 'g', 'w', 'r', 'd', 'e', 'a', 'b']
dict = ['we', 'bag', 'got', 'word']
// returns 3 ( for ['we', 'bag', 'got'] )

编辑,以明确遵守SO指南:

寻找解决方案。我在接受采访时遇到了这个问题。我的解决方案如下,但它被拒绝太慢了。

1.) For each word in dict, w
  - Remove w's letters from the arr.
  - With the remaining letters, count how many other words could be spelled.  
    Put that # as w's "score"
2.) With every word "scored", select the word with the highest score,  
    remove that word and its letters from the input arrays.
3.) Repeat this process until no more words can be spelled from the remaining 
    set of letters.

3 个答案:

答案 0 :(得分:1)

这是一个相当普遍的包装问题,最多有26个资源。如果我在实践中尝试解决这个问题,我会将其表示为整数程序并应用整数程序求解器。这是给定实例的示例公式:

maximize x_ab + x_azz + x_bzz
subject to
constraint a: x_ab + x_azz <= 1
constraint b: x_ab + x_bzz <= 1
constraint z: 2 x_azz + 2 x_bzz <= 4
x_ab, x_azz, x_bzz in {0, 1} (or integer >= 0 depending on the exact variant)

求解器将解决该程序的线性松弛问题,并且在此过程中为每个字母设置了一个价格,表明它是多么有用,这使得求解器能够在令人惊讶的大型实例上快速找到可证明的最佳解决方案(尽管这是对于任意大小的字母表来说,这是一个NP难题,所以对人工实例(例如NP硬度降低所导致的实例)不要太多。)

我不知道你的面试官在寻找什么 - 也许是一个动态的程序,其状态是多字节的未使用的字母。

答案 1 :(得分:0)

一种可能的动态编程解决方案的表达式如下:

WordCount(dict,i,listOfRemainingLetterCounts) = 
   max(WordCount(dict,i-1,listOfRemainingLetterCounts),
       WordCount(dict,i-1,listOfRemainingLetterCountsAfterReducingCountOfWordDict[i]))

我认为这是一个多方面的问题。面试官对你的回答印象深刻吗?

答案 2 :(得分:0)

将字母列表转换为一组字母出现对。如果在列表中每次出现相同字母时增加出现次数,例如aba设置为a-1 b-1 a-2

以类似的方式独立翻译字典中的每个单词;所以coo这个词就成了一个集:c-1 o-2

如果一个单词的字母出现是从原始字母列表生成的集合的子集,则接受该单词。

对于固定字母和最大字母频率,这可以使用位集很快实现,但同样,速度有多快?