【问题标题】:Generate all strings under length N in C在C中生成长度为N的所有字符串
【发布时间】:2011-01-21 22:43:55
【问题描述】:

我尝试自己编写代码,但失败了。这基本上就是我想要的:

a
b
...
z
aa
ba
...
za
ab
bb
...
zz
aaa
baa
...
zzz

最后它应该生成每个短于 N 个字符且字符集 a-z 的字符串。所以我不是在寻找 permutations(其中 1001 个实现可以在互联网上找到),而是寻找 combinations with replacement(至少在 Python 中是这样调用的) . 顺序不重要,速度才是。

【问题讨论】:

  • 你不够具体。就像你生成了“baa”一样,你还会生成“aba”、“abb”和“aab”吗?

标签: c algorithm


【解决方案1】:

看起来你想要它在 C 中,这是一种方法:

#include <stdlib.h>
#include <stdio.h>

int inc(char *c){
    if(c[0]==0) return 0;
    if(c[0]=='z'){
        c[0]='a';
        return inc(c+sizeof(char));
    }   
    c[0]++;
    return 1;
}

int main(void){
    int n = 3;
    int i,j;
    char *c = malloc((n+1)*sizeof(char));
    for(i=1;i<=n;i++){
        for(j=0;j<i;j++) c[j]='a';
        c[i]=0;
        do {
            printf("%s\n",c);
        } while(inc(c));
    }
    free(c);
}

【讨论】:

  • 这几乎是完美的,它只是跳过了第一次迭代(a、aa、aaa)。将 while(inc(c)) 更改为 do ... while (); 循环修复了该问题。这里也没有理由使用malloc,因为我不会保留兆字节(更不用说我们不应该在C 中转换malloc)。除此之外,那些小细节享受您接受的答案和 +1 :)
  • 很好,我修复了do-while的事情。至于强制转换 malloc,这可能是因为我用一些旧式编译器学习 C,当我没有时抱怨......
  • 请注意,sizeof(char) 根据定义始终为1。这意味着inc(c + sizeof(char)) 可以正常工作,但看起来是错误的,因为指针运算已经以相应类型的单元完成。
【解决方案2】:

类似这样的东西(伪代码):

void CompWithRep(string line,int N) {
  char c;
  if (N==0) return;
  for (c = 'a' ; c <= 'z' ; c++ )
  {
    printf(line + c);
    CompWithRep(line + c,N-1);
  }
}

【讨论】:

  • 您正在混合变量 c、i 和 a。
  • @Yochai,请研究这条线for (c = 'a' ; c &lt; 26 ; c++ )和研究ascii table
  • 遍历字母。将新字母连接到您已有的行,递归发送到 N 的深度。不要记住带有字符串等的确切 C 语法。
  • @Yochai:我认为@nightcracker 是说你应该拥有for(c='a'; c &lt; 26+'a'; c++)
  • 是的,将其修复为
猜你喜欢
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
相关资源
最近更新 更多