Java中的字符串排列(非递归)

7

我是一名高中10年级的学生,正在尝试解决关于Java数据结构和算法书籍中的问题。

其中一个问题是打印出一个字符串的所有排列。

class C14
{
public static void main(char a[])
{
    // char[] a = {'c','a','r','b','o','n'};
    int c=0,w=0;
    for(int q = 0;q<a.length;q++) 
    {
        for(int i=0;i<a.length;i++)
        {
            for(int j=1;j<a.length;j++)
            {
                for(int k=1;k<a.length-1;k++) 
                {
                    for(int z=0;z<a.length;z++)
                    {
                        System.out.print(a[z]);
                        c++;
                    }
                    w++;
                    System.out.println();
                    char p=a[k+1];
                    a[k+1]=a[k];
                    a[k]=p;
                }
                System.out.println();
            }
            System.out.println();
            char x=a[0];
            a[0]=a[1];
            a[1]=x;
        }
      }
    System.out.println(" Character count = " + c);
    System.out.println(" Word count = " + w);
    }
}

这是我的尝试。这本书要求我对“c”、“a”、“r”、“b”、“o”、“n”这些字符进行操作。 我的解决方案确实做到了这一点,但当我尝试使用三个或四个字母的单词时,它会出现重复。如果我删除最外层的循环并尝试打印它,它可以处理三个和四个字母的单词,但不能处理五个或更多字母的单词。
我很乐意澄清我的想法,我知道这不是最有效的方法,但请记住我只是十年级的学生,这是我首先想到的方法。
有人能帮帮我,或者至少提示一下哪里有问题吗? 请不要建议递归解决方案,因为我想先迭代地解决它。 谢谢, Sumit。

这个怎么样 - https://dev59.com/1Wct5IYBdhLWcg3wqfL9? - Grisha Weintraub
感谢您的回复,非常感激。 但问题是,我认为我不能使用StringBuilder和substring函数等(不允许使用)。 - Sumit Shyamsukha
1
你想对数组 'a' 进行排列组合,而不用每次更改循环,即使 'a' 的大小发生变化? - John Eipe
1个回答

3

重复排列

当你有n个物品可以选择时...每次都有n种选择!

当选择其中r个时,排列方式为:

n × n × ... (r次) = n^r

我会展示两种情况。第一种情况是我们已经知道n和r的大小,这种情况比较容易。第二种情况是n和r是动态变化的。

//when n and r are known statically

class Permutation
{
    public static void main(String[] args)
    {
        char[] values = {'a', 'b', 'c', 'd'};
        int n = values.length;
        int r = 2; 

        int i = 0, j = 0;
        for(i=0; i<n; i++)
        {
            for(j=0; j<n; j++)
            {
                System.out.println(values[j] + " " + values[i]);
            }
        }
    }
}


//when n and r are known only dynamically

class Permutation
{
    public static void main(String[] args)
    {
        char[] values = {'a', 'b', 'c', 'd'};
        int n = values.length;
        int r = 2; 
        int i[] = new int[r];
        int rc = 0;
        for(int j=0; j<Math.pow(n,r); j++)
        {

            rc=0;
            while(rc<r)
            {
                System.out.print(values[i[rc]] + " ");
                rc++;
            }
            System.out.println();
            rc = 0;
            while(rc<r)
            {
                if(i[rc]<n-1)
                {
                    i[rc]++;
                    break;
                }
                else
                {
                    i[rc]=0;
                }
                rc++;
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接