目录
题目解析
从字符串数组中每次选取一个元素,作为结果中的第一个元素;然后,对剩余的元素全排列。
全排列
从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
}
}
判断一个字符串是否全部相同
例如字符串为【好好好】,单个字符都是相同的一个【好】字,那么这个字符串是没有办法进行全排列的,因为没有意义,故而需要加上这个判断。
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);
}
}
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);
}
}
这种就不是一样的了,就能进行全排列操作了。
其实最好就是每个字符都不一样的进行全排列。
判断一个字符串是否全部不相同
问题:一个字符串,判断每个字符串都不一样
测试字符串:【我要瞅一瞅你】,由于有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
测试字符串【你瞅啥】,由于都不相同,需要返回【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;
}
}
这个其实比较简单,但是在判断的时候很多的时候会用到,当然,还可以采用更快捷的方式。我这个直接暴力了。