-2

我正在尝试制作一个函数来输出字符串的所有可能情况。该函数必须输出字符串的每个变体并为该变体保留一个计数器。例如,没有特定的顺序:

Cd
C>d
C>D
CD
cd
cD
c>D
c>d

到目前为止,我有这个:

public int allCase(String data)
{
    int count=0; // counter for the amount of case changes completed
    int size= data.length();// length of incoming string
    char c[]= data.toLowerCase().toCharArray();
    double maxpos=Math.pow(2,size);
  System.out.println("Maximum possibilities= "+maxpos);
    for(int i=0;i<size;i++)
    {          
      if (c[i]> 33 &&  c[i]<64) // if the character is special characters !@#$%^&*()_<>?,./
      {                     // prints characters in front  and behind of special character
        System.out.println( data.substring(0,i)+((char)(c[i]+16))+data.substring(i+1));
      }
      else{
      // output the string variation

      }
        count++;                                                       
    }

    return count;
}
4

1 回答 1

1

您可以将字母字符作为一个组来处理,加或减 32,但其余的映射不够规则,无法胜过表格查找。

保留两个平行的字符串:

shifted   = "ABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$%^&*()_+|<>?:\"{}";
unshifted = "abcdefghijklmnopqrstuvwxyz`1234567890-=\,./;'[]";

然后,使用 .indexOf() 查找一个或另一个字符串中的每个字符。在另一个字符串的相同索引处找到相反的移位。如果一个字符不在任一字符串中,则它是一个空格或另一个不属于移位/未移位对的字符。然后,要生成的字符串总数为 2^(在其中一个字符串中找到的字符数)。

说到 2 的幂,使用 Math.pow() 是计算 2 的小幂的一种糟糕方法。使用1L<<n而不是 Math.pow(n) 表示 integers ,0 <= n <= 62或者即使你只能忍受打印出十亿左右的字符串。1<<n0<=n<=30

您可以制作一个迭代版本,从索引值 0 循环到 (2^n)-1,其中 n 是输入字符串的长度,然后循环 k=0 到 (n-1) 测试位 k外循环索引值,查看是否打印大写或小写版本的字符。我以前没见过,但是 Hot Licks 有一个关于使用这种方法的评论。index&(1<<k)要执行该测试,当且仅当在 (index) 中设置位 k 时 ,观察它是非零的。

递归版本要简单得多,但我怀疑您稍后会了解这一点。

于 2013-09-22T02:22:30.540 回答