标签:arr 排列 Java String 递归 int length str public
目录
题目解析
从字符串数组中每次选取一个元素,作为结果中的第一个元素;然后,对剩余的元素全排列。
全排列
从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;
}
}
这个其实比较简单,但是在判断的时候很多的时候会用到,当然,还可以采用更快捷的方式。我这个直接暴力了。
标签:arr,排列,Java,String,递归,int,length,str,public 来源: https://blog.csdn.net/CSDN_765/article/details/123035027
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。