【问题标题】:Algorithm: Printing the correct index for the character sequence算法:打印字符序列的正确索引
【发布时间】:2013-07-16 17:26:23
【问题描述】:

我在准备考试时遇到了以下问题:

想象一个单词的字母表。示例:

a ==> 1
b ==> 2
c ==> 3
...
z ==> 26
ab ==> 27
ac ==> 28
...
az ==> 51
bc ==> 52
and so on.

字符序列只需按升序排列(即“ab”有效但“ba”无效)。

问题:给定任何单词,如果有效则打印其索引,否则打印 0。

Input Output
ab 27
ba 0
aez 441 

任何有关如何解决此问题的指针将不胜感激。

【问题讨论】:

  • 你有什么尝试吗?什么没用?你需要问一个具体的问题。
  • @hivert: aa 不在“升序”中。
  • 我认为您不需要算法。我想你想要一个公式。
  • @Geobits 可能,如果是这样的话,OP 可能会受益于看看公式是如何得出的。

标签: algorithm combinations combinatorics


【解决方案1】:

让我给你一些提示:

  • 你能找到一个公式来计算给定长度k的此类单词的数量吗?
  • 现在修正一个长度k 和一个字母l。以l开头的k是多少个字?

提示:帕斯卡三角形。如果您需要更多提示,http://en.wikipedia.org/wiki/Combinadic 可以提供帮助。如果需要一些实现,可以从(Python语言)https://github.com/sagemath/sagelib/blob/master/sage/combinat/choose_nk.py987654322@中定义的rank函数中获得灵感

【讨论】:

  • 您的意思是,从 26 个字母中计算出 选择 k 的方法?等等? :-)
  • 这看起来很有趣。让我对此挠头。 :D
  • 对于 k=1,会有 26 个这样的词。对于 k=2,会有 (25+24+...+1+0) 个这样的词。对于 k=3,将有 ((24+23+...+1) + (23+22+...+1) + (22+21+...+1) + ... + ( 2+1) + (1)) 这样的话。这在我看来有点动态编程。 :S
  • 是的!如果要计算完整的关联表,这与通过某种动态规划算法计算帕斯卡三角形密切相关。
【解决方案2】:
  1. 确保输入仅为字母。否则失败。
  2. 根据字符串长度减 1 设置循环。
  3. “减去”字符串中第一个字母的值。如果该值为零或正数,则完成,因为字符串不升序,因此返回 0。
  4. 重复通过向上移动字符串一次一个字母检查下一个字母。
  5. 如果到最后,就是升序字符串。

公平地说,我没有提到如何计算指数值的算法,只是退出案例。但它为您提供了一个正确方向的开始,并且计算索引将遵循相同的框架。

更多信息:

从第一个字母开始向上计数。当您点击“z”时,重置为下一个有效字符串并继续计数 - >“aa”失败不要计算它。添加到下一个,这里是“ab”。一旦你点击“az”,尝试“ba” - 失败,继续添加字母直到你得到一个有效的字符串“bc”并重新开始计数。它就像一个向上计数的里程表。

当慢,但它应该可以工作,因为它是您手动执行的操作以获得答案。

顺便说一句,@hivert 暗示了一个更优雅的解决方案,几乎可以立即计算...

【讨论】:

  • 我认为你跳过了问题的难点。
  • 我正在努力为 OP 留下尽可能多的肉。一开始我不确定他在寻找多少“帮助”,所以我只给出了一个小的框架提示。如果需要,我可以(尝试?)稍后添加更多。如果需要很简单,它总是可以作为蛮力来完成的。数一数,当你到达字母表的末尾时,“调整”:)
  • @MichaelDorgan:我能够想出类似的方法来丢弃无效序列。为有效字符串生成输出是困扰我的问题。 :)
  • @hivert 暗示了一个数学解决方案
  • 知道了 - 好的,我会很快添加一个蛮力方法。其他人可以处理更优雅的解决方案,例如下面的答案;)
猜你喜欢
  • 2021-12-15
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2023-03-11
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多