算法:打印字符序列的正确索引

时间:2013-07-16 17:26:24

标签: algorithm combinations combinatorics

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

想象一下单词的字母。例如:

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 

任何关于如何解决这个问题的指示都将不胜感激。

2 个答案:

答案 0 :(得分:7)

让我给你一些提示:

  • 您能找到给定长度k
  • 这类字数的公式吗?
  • 现在修改一个k长度和一个字母l。从k开始,有多少长度为l的单词?

提示:Pascal三角形。如果您需要更多提示,http://en.wikipedia.org/wiki/Combinadic可以提供帮助。如果您需要一些实现,可以从(Python语言)https://github.com/sagemath/sagelib/blob/master/sage/combinat/choose_nk.py

中定义的rank函数中获得灵感

答案 1 :(得分:2)

  1. 确保输入仅为字母。如果没有失败。
  2. 根据字符串长度减1来设置循环。
  3. 从下一个“减去”字符串中第一个字母的值。如果值为零或正值,则完成后,因为字符串不是递增的,所以返回0。
  4. 重复一次向上移动一个字母,检查下一个字母。
  5. 如果你到了最后,它是一个升序字符串。
  6. 公平地说,我没有提到如何计算索引值的算法,只是退出案例。但它为您提供了正确方向的开端,计算索引将遵循相同的框架。

    更多信息:

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

    D慢,但它应该工作,因为你手动做的是得到答案。

    顺便说一下,@ hivert提出的更优雅的解决方案几乎可以立即计算......