【问题标题】:Given an dictionary of words and and an array letters, find the maximum number of dictionary words which can be created using those letters给定一个单词字典和一个数组字母,找到可以使用这些字母创建的字典单词的最大数量
【发布时间】:2018-06-07 13:07:06
【问题描述】:

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

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

示例 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.

【问题讨论】:

  • 你想要python解决方案吗?
  • 那么你的问题是什么?你要求我们为你做作业吗?我们很乐意提供帮助,但您需要付出一些努力。请阅读meta.stackoverflow.com/questions/334822/…
  • 描述也不清楚并且有错误 - 您可以清楚地创建比示例中提供的更多的单词
  • 一个词可以多次使用吗?
  • @squeamishossifrage 这种技术会在第一个示例中找到azz 吗?

标签: algorithm


【解决方案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-hard 问题,因此不要对人工实例(例如由 NP-hardness 降低产生的实例)抱太大期望)。

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

【讨论】:

  • 如果他们拒绝你的解决方案,因为速度太慢,没有任何必要的速度规范,那么请指出他们的缺陷!
【解决方案2】:

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

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

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

【讨论】:

  • 他们没有留下深刻的印象,我没有继续面试过程的下一步。我认为这是由于我给出的答案。
【解决方案3】:

将字母列表转换为一组字母出现对。在列表中每次出现相同字母时,出现的次数都会增加,例如aba 成为a-1 b-1 a-2 的集合

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

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

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

【讨论】:

    猜你喜欢
    • 2017-02-17
    • 2014-10-07
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    相关资源
    最近更新 更多