Algorithm 映射到值的字母表:如何找到与给定值相加的实际单词?

Algorithm 映射到值的字母表:如何找到与给定值相加的实际单词?,algorithm,list,word,Algorithm,List,Word,我遇到一个G+帖子,其中有人分享: If A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Equals 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 Then K + N + O + W + L + E + D + G + E = 96% H + A + R + D + W + O + R + K

我遇到一个G+帖子,其中有人分享:

If
  A B C D E F G H I J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z

Equals
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

Then
  K + N + O + W + L + E + D + G + E = 96% 
  H + A + R + D + W + O + R + K     = 98%

But
  A + T + T + I + T + U + D + E     = 100%
就这么多了,为了好玩,忽略了百分比的把戏 剩下的就留给G+评论了

但我问我自己:找到所有问题的最佳算法是什么
给定单词列表中的单词一组固定的n个单词,加起来有100个?

我认为直接的方法会很好-它在:

创建一个将每个字母与点值关联的哈希表 循环浏览列表。对于每个单词,求和与哈希表中的字母相关联的数字的值。如果总数为100,则打印单词或以某种方式将其标记为找到添加到新列表或其他内容中。。。
我想,如果你说单词可以任意长,那么你可以争论这个问题;但是,如果单词列表是某种语言中单词的子集,则不必担心这一点。如果m是一个单词中的最大字母数,那么算法是Onm。尽管如此,在某个时候,你还是要看每个字母和每个单词,因此我无法想象还有比这更省时的算法。

我认为简单的方法是好的-它是:

创建一个将每个字母与点值关联的哈希表 循环浏览列表。对于每个单词,求和与哈希表中的字母相关联的数字的值。如果总数为100,则打印单词或以某种方式将其标记为找到添加到新列表或其他内容中。。。
我想,如果你说单词可以任意长,那么你可以争论这个问题;但是,如果单词列表是某种语言中单词的子集,则不必担心这一点。如果m是一个单词中的最大字母数,那么算法是Onm。尽管如此,在某个时刻,你将不得不查看每个字母和每个单词,因此我无法想象有一个更省时的算法。

讨论了一个类似的问题。然而,您的具体问题表明了一种更简单的方法。由于单词列表中的单词数量是有限的,并且始终小于最长单词长度内的字符排列数量,因此最好按照以下方式进行操作:

假设我们有一个charToNum函数,它将一个字符映射到相应的数字:

for each word in wordlist
  sum := 0
  for each character in word
    sum := sum + charToNum(character)
    if (sum > 100)
      break // Correct result no longer possible
  if (sum == 100)
    Add the word to the result set

讨论了一个类似的问题。然而,您的具体问题表明了一种更简单的方法。由于单词列表中的单词数量是有限的,并且始终小于最长单词长度内的字符排列数量,因此最好按照以下方式进行操作:

假设我们有一个charToNum函数,它将一个字符映射到相应的数字:

for each word in wordlist
  sum := 0
  for each character in word
    sum := sum + charToNum(character)
    if (sum > 100)
      break // Correct result no longer possible
  if (sum == 100)
    Add the word to the result set

+1,如果初始字符值的总和已大于100,则通过不循环整个单词来节省时间。当然,这并不能从大O的角度提高效率。谢谢@Matthewaddams和Chris。由于这个例子和break语句,我将接受它和+1 Matthew's.+1,因为如果初始字符值的总和已经大于100,则不在整个单词上循环,从而节省了一些时间。当然,这并不能从大O的角度提高效率。谢谢@Matthewaddams和Chris。这个例子和break语句一起使用,我接受它和+1 Matthew的。就像Chris的回答一样,如果初始字符值的总和已经大于100,那么不循环整个单词可以节省一些时间。当然,这并不能从大O的意义上提高效率。引用我在Chris的回答中的其他评论,如果初始字符值的总和已经大于100,则不循环整个单词可以节省一些时间。当然,这并不能从大O的意义上提高效率。引用我的另一句话哦,我一直喜欢上学。但是17年后。。。这纯粹是出于好奇@wildplasser@wildplasser谷歌翻译有资格做家庭作业吗但是我不认为它会带来好成绩。哦,我一直喜欢上学。但是17年后。。。这纯粹是出于好奇@wildplasser@wildplasser谷歌翻译有资格做家庭作业吗但我认为这不会带来好成绩。