Java递归,全排列

目录

判断一个字符串是否全部相同

判断一个字符串是否全部不相同


题目解析

从字符串数组中每次选取一个元素,作为结果中的第一个元素;然后,对剩余的元素全排列。

全排列

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

公式:全排列数f(n)=n!(定义0!=1)

例如:如果是对任意的三个字符进行全排列,也就是3!=6,当然,如果是相同的就只有1次

String a="一二三";

三个字符,全排列,6中结果

 一二三

一三二

二一三

二三一

三一二

三二一

 

三个相同字符串,就一次

例如 

String a="好好好";

好好好

那么我们要编辑出这种排列方法:

package active;

public class demos {

public static void main(String[] args) {

    String a="一二三";

    char[] arr=a.toCharArray();

    int count=0;

    //"字符串不能完全相同"判断

    for (int i = 0; i < arr.length-1; i++) {

        if(arr[i]==arr[i+1]) {

            count++;

        }

    }

    if(count==arr.length-1) {

        System.out.println(a);

        return;

    }

    // 通过字符处理

    f(a.toCharArray(),0,a.length()-1);

}

public static void f(char[]a,int from,int to) {

    if(from==to) {//递归终止条件

        System.out.println(a);//打印结果

    }else {

        // 从from开始,循环到to结束

        for(int i=from;i<=to;i++) {

            change(a,i,from);//交换前缀,作为结果中的第一个元素,然后对剩余的元素全排列

            f(a,from+1,to);//递归调用,缩小问题的规模,form每次+1

            change(a,from,i);//换回前缀,复原字符数组

        }

    }

}

/**

 * 用于交换的

 *

 * @param s

 * @param from

 * @param to

 */

private static void change(char[] a, int from, int to) {

    // TODO Auto-generated method stub

    char temp=a[from];// 定义第三方temp,获取from

    a[from]=a[to];// 从to交换到from

    a[to]=temp;// 从temp还给to

}

}

 Java递归,全排列

 

 

判断一个字符串是否全部相同

例如字符串为【好好好】,单个字符都是相同的一个【好】字,那么这个字符串是没有办法进行全排列的,因为没有意义,故而需要加上这个判断。

package active;

public class demo1 {

public static void main(String[] args) {

    String a="好好好";

    char[] arr=a.toCharArray();

    int count=0;

    for (int i = 0; i < arr.length-1; i++) {

        if(arr[i]==arr[i+1]) {

            count++;

        }

    }

    System.out.println(count==arr.length-1);

}

}

 Java递归,全排列

 

 

 true代表这个字符串就是完全相同的一个字符。

package active;

public class demo1 {

public static void main(String[] args) {

    String a="一二三";

    char[] arr=a.toCharArray();

    int count=0;

    for (int i = 0; i < arr.length-1; i++) {

        if(arr[i]==arr[i+1]) {

            count++;

        }

    }

    System.out.println(count==arr.length-1);

}

}

 Java递归,全排列

 

这种就不是一样的了,就能进行全排列操作了。

其实最好就是每个字符都不一样的进行全排列。

判断一个字符串是否全部不相同

问题:一个字符串,判断每个字符串都不一样

测试字符串:【我要瞅一瞅你】,由于有2个瞅字,故而返回【false】

 

package active;

public class demo2 {

public static void main(String[] args) {

    String a = "我要瞅一瞅";

    System.out.println(isf(a));

}

public static boolean isf(String str) {

    if (str == null) {

        return false;

    }

    for (int i = 0; i < str.length(); i++) {

        for (int j = 1; j < str.length(); j++) {

            if ((str.charAt(i) == str.charAt(j))&&i!=j) {

                System.out.println(i+":"+j+"相同");

                return false;

            }

        }

    }

    return true;

}

}

 下标的与4相同故而返回false 

 Java递归,全排列

 

 

 测试字符串【你瞅啥】,由于都不相同,需要返回【true】

 

package active;

public class demo2 {

public static void main(String[] args) {

    String a = "你瞅啥";

    System.out.println(isf(a));

}

public static boolean isf(String str) {

    if (str == null) {

        return false;

    }

    for (int i = 0; i < str.length(); i++) {

        for (int j = 1; j < str.length(); j++) {

            if ((str.charAt(i) == str.charAt(j))&&i!=j) {

                System.out.println(i+":"+j+"相同");

                return false;

            }

        }

    }

    return true;

}

}

 Java递归,全排列

 

 

 

 

这个其实比较简单,但是在判断的时候很多的时候会用到,当然,还可以采用更快捷的方式。我这个直接暴力了。 

上一篇:ZZUIL题解1141-1150(C语言版)


下一篇:javaweb有弹窗出现乱码