Algorithm 用字母表表示一个单词

Algorithm 用字母表表示一个单词,algorithm,data-structures,count,Algorithm,Data Structures,Count,这是一个采访问题: Imagine an alphabet of words. Example: 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 4

这是一个采访问题:

Imagine an alphabet of words. Example:
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
注意:不允许使用暴力。以下是问题的链接:

Imagine an alphabet of words. Example:
a ==> 1
b ==> 2
c ==> 3
.
z ==> 26
ab ==> 27
ac ==> 28
.
az ==> 51
bc ==> 52
and so on.
我可以将该解决方案理解为:

  • 单词总数为2^26-1
  • 对于给定的单词,大小较小的单词首先出现
  • n是单词的长度,
    • 大小小于n的单词总数为C(26,1)+C(26,2)+…+C(26,n-1)
  • 然后计算在给定单词之前有多少个大小相同的单词
  • 两个数之和加上一就是结果
参考:sites.google.com/site/spaceofjameschen/annnoments/printtheindexofawordwithlettersinascendingorder--microsoft

在示例解决方案中,我理解了作者如何计算小于word.size()的单词数。但是,在代码中,我不太确定如何找到在“word”之前出现的与word.size()大小相同的单词数

准确地说,这一点:

char desirableStart;  
i = 0;
while( i < str.size()){     
    desirableStart = (i == 0) ? 'a' : str[i - 1] + 1;   

    for(int j = desirableStart; j < str[i]; ++j){
        index += NChooseK('z' - j, str.size() - i - 1);     // Choose str.size() - i - 1 in the available charset
    }

    i ++;
}
char-desiredableStart;
i=0;
而(i

有人能帮我理解这一点吗?谢谢。

相同大小的字数的计算与较短字数的计算没有区别

您可能会被c中从0开始的数组索引引入歧途。因此,尽管
i
可能会提出相反的建议,但此循环的最后一次迭代实际上统计与计算索引的单词大小相同的单词。

首先(您可能得到了这一部分,但为了完整性起见),
NChooseK
函数计算二项式系数,即从一组n个元素中选择k个元素的方法的数量。此函数在您的注释中称为
C(n,k)
,因此我将使用相同的表示法

由于字母被排序且不重复,这正是问题中描述的创建n字母单词的方法,因此这就是函数的第一部分将您置于正确位置的原因:

int index = 0;
int i = 1;

while(i < str.size()) {
    // choose *i* letters out of 26
    index += NChooseK(26, i);
    i++;
}

在编写代码之前,你应该在纸上研究这个问题。尝试示例、设计和测试算法,并证明其正确性。编码是一种干扰。计算机可以帮助你计算,但却不能帮助你思考。三年后再看一遍这个解释,一读就明白了。有没有办法让我给这个答案一个“双重喜欢”?!:)@达斯。维德:非常感谢,很高兴听到这个消息。老实说,在我的国家,现在是早上,我正在喝我的第一杯咖啡,我不知道这个代码是关于什么的这就是当我在半睡半醒的时候写一些代码,第二天早上醒来却想知道:这是谁昨晚写的。。不是我。