0

在 C 中,我有一个 char 数组,其中包含随机数字和没有大写字母的字母。我需要弄清楚如何生成所有可能的组合,包括大写字母,同时保持数字不变,但我什至不知道从哪里开始。(例如 abc123, Abc123, aBc123, abC123, ABc123, AbC123, aBC123, ABC123)

4

2 回答 2

2

事实上,这将是 2^n 种可能性,n 表示您在 char 数组中拥有的字母字符的数量。

为了解决你的问题,我建议你看看recursion,我想这是实现你想要做的最简单的方法,你只需要和平时有点不同的想法。

编辑:这是一些实现

void enumerate(char *str, int n)
{
  printf("%s\n", str); // Print one solution
  while (++n < strlen(str)) // Loop while you don't reach the end
    if (str[n] > 96 && str[n] < 123) // Check if str[n] is alphabetic
      {
        char *tmp = calloc(strlen(str) + 1, sizeof(char));
        strcpy(tmp, str); // Create a copy of the initial string
        tmp[n] -= 32; // Put tmp[n] = str[n] in uppercase
        enumerate(tmp, n); // Call recursion with new string and current position
      }
}

你这样称呼它

enumerate("abc123", -1);

结果是

abc123
Abc123
ABc123
ABC123
AbC123
aBc123
aBC123
abC123
于 2015-05-22T20:59:33.200 回答
1

目前,忽略数字。

假设您现在有 x 个字符。如果 x=3(假设),则考虑从 0 到 7 的数字,因为 2^3 - 1 是 7(-1 因为您必须将 0 视为一种状态)。

然后,您必须遍历所有数字并在其位为 1 时将字母大写。

例子:

  • abc - 000 (0)
  • abC - 001 (1)
  • ABC - 010 (2)
  • aBC - 011 (3)
  • 美国广播公司 - 100 (4)

这是它的代码,适用于那些无法遵循理论解释的人。

void enumerate (String input) {

    int count = 0;
    //count the number of non-digit characters
    for(int i=0; i<input.length(); i++)
        if(!Character.isDigit(input.charAt(i))) {
            count++;
        }

   count =(int) Math.pow(2,count); 
   //printing all the combinations.
   int i=0, digit=0;
   while(count--> 0) {
       String output = ""; 
       for(int j=input.length()-1; j>=0; j--) {
           char c = input.charAt(j);   
           if(Character.isDigit(c))
               output = (char)c + output;
           else {
               output = (char) (((i&1) == 1)? c-32 : c) + output;
               i = i>>1;
           }
       }
       System.out.println(output);
       i = ++digit;

   }
}
于 2015-05-22T19:51:37.893 回答