java 字符串全排列大全 (已解决重复问题)
//字符串全排列问题 (解决了重复问题)
import java.util.*;
public class ListALL {
static int count=0;
public static void main(String[] arg) {
Scanner r=new Scanner(System.in);
String s=r.nextLine();
Pailie(s, " ");
System.out.println("共有 "+count+"种情况");
}
static void Pailie(String s,String p) {
if(s.length()<1) {
System.out.println(p);//字符串长度小于1,换行
count++;
}
else{
int index[]=new int[s.length()];
for(int i=0;i> insert(
LinkedList> list, char inserChar) {
LinkedList> reValue = new LinkedList>();
LinkedList temp1;
LinkedList temp2;
for (int i = 0; i < list.size(); i++) {
temp1 = list.get(i);
for (int j = 0; j <= temp1.size(); j++) {
temp2 = (LinkedList) temp1.clone(); // temp2 = copy(temp1);
temp2.add(j, inserChar);
reValue.add(temp2);
}
}
return reValue;
}
public LinkedList> paixu() {
char[] inputChar = this.input.toCharArray();
LinkedList> ini = new LinkedList>();
LinkedList> reValue = new LinkedList>();
LinkedList temp = new LinkedList();
temp.add(inputChar[0]);
ini.add(temp);
for (int i = 1; i < inputChar.length; i++) {
ini = insert(ini, inputChar[i]);
if(i==inputChar.length-1)
reValue.addAll(ini);
}
return reValue;
}
// @param args
public static void main(String[] args) {
ListALL q = new ListALL("121");
LinkedList> reValue = q.paixu();
for (int i = 0; i < reValue.size(); i++) {
System.out.print("第"+(i+1)+"个");
LinkedList temp1 = reValue.get(i);
for (int j = 0; j < temp1.size(); j++) {
System.out.print(temp1.get(j));
}
System.out.println();
}
}
}*/
/*public class ListALL {
public static int t=0;// 组合个数
public static void main(String[] args) {
String str = "1234";
char[] c = str.toCharArray();
//println(c);
//t++;
allCombString(c, 0);
System.out.println(t);
}
public static void allCombString(char[] c, int s) {
int len = c.length;
if (s == len-1) {
println(c);
t++;
} else {
for (int i = s; i < len; i++) {
moveToHead(c, i, s);
//char ct[] = new char[l];
//System.arraycopy(c, 0, ct, 0, l);// 保持其他元素位置不变
allCombString(c, s + 1);
moveBack(c, i, s); //既然改变了位置,那就再改回来
}
}
}
public static void moveToHead(char[] c, int id, int s) {
if (id > s && id < c.length) {
char temp = c[id];
for (int i = id; i > s; i--) {
c[i] = c[i - 1];
}
c[s] = temp;
//println(c);
//t++;
}
}
public static void moveBack(char[] c, int id, int s) {
if (id > s && id < c.length) {
char temp = c[s];
for (int i = s; i < id; i++) {
c[i] = c[i+1];
}
c[id] = temp;
//println(c);
//t++;
}
}
public static void println(char[] c) {
System.out.println(new String(c));
}
}
*/
/*public class ListALL {
public static int t;//组合个数
public static void main(String[] args) {
String str = "112";
char[] c = str.toCharArray();
System.out.println(c);
t++;
allCombString(c,0);
System.out.println(t);
}
public static void allCombString(char[] c,int s){
int l = c.length;
if(l-s==2){
char temp = c[l-1];
c[l-1] = c[l-2];
c[l-2] = temp;
println(c);
t++;
}
else{
for(int i=s;is&&ids;i--){
c[i] = c[i-1];
}
c[s] = temp;
println(c);
t++;
}
}
public static void println(char[] c){
System.out.println(new String(c)); }
} */
/*
设计思路:
1、n个字符,顺序选取其中第1个;
2、在剩下的n-1个字符中,再选取其中的第1个;
3、若剩余的字符只剩下2个,则这两个字符交换位置;若不是,则继续第2步。
4、这是一个典型的递归,无论有多少个字符,到最后只需交换最后两个字符即可。
5、为了能按顺序选取字符(因为递归之后会影响字符的顺序,如:“abcd”经过第一轮递归之后变成“adbc”,
这时再执行第2步的话,取到的字符是“d”,而不是“b”),所以这里使用了数组拷贝,for循环不受递归的影响。
(这个问题想了老半天,暂时只能用这种方法,即使效率比较低)。
6、组合的个数是字符个数的阶层,如“abc”,组合个数为3!=6 */
/*//未解决重复问题
import java.util.Arrays;
public class ListALL {
static String[] listMe = {"2","2","3"};
static int listMeLen = listMe.length;
public static void list(String insert,String[] inserted) {
int insertedLen = inserted.length,
tempInsertedLen = insertedLen + 1;
String tempInserted[] = new String[tempInsertedLen];
for (int i = 0; i < tempInsertedLen; i++) {
System.arraycopy(inserted,0,tempInserted,0,i);
tempInserted[i] = insert;
System.arraycopy(inserted,i,tempInserted,i+1,tempInsertedLen - i - 1);
if (tempInsertedLen == listMeLen)
System.out.println(Arrays.asList(tempInserted));
else
list(listMe[tempInsertedLen],tempInserted);
}
}
public static void main(String[] args) {
list(listMe[1],new String[]{listMe[0]});
}
}*/
/*
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class ListAll {
//使用createList方法,填充参数列表传递过来的List,默认是Integer,一般是这个类型,你可以修改别的类型
public void createList(int n,List list){
if(n==0){
n=3;
}
for(int i=1;i<=n;i++){
list.add(i);
}
}
*//**添加了一个参数在递归的方法中,用来记录原list的长度,使得每次的排列字符串输出可以完全记载到
* 第二个参数prefix,不使用2,而是使用length来判断是否加最后一个元素入prefix,从而结束输出
* printAll是输出全排列的递归调用方法,list是传入的list,用LinkedList实现,
* 而prefix用于转载以及输出的数据
* length用于记载初始list的长度,用于判断程序结束。
*//*
public void printAll(List candidate, String prefix,int length){
if(prefix.length()==length)
System.out.println(prefix);
for (int i = 0; i < candidate.size(); i++) {
List temp = new LinkedList(candidate);
printAll(temp, prefix + temp.remove(i),length);
}
}
*//**
* 测试代码
*//*
public static void main(String[] args) {
ArrayList list=new ArrayList();
ListAllPrint lap=new ListAllPrint();
lap.createList(5, list);
lap.printAll(list,"",list.size());
}
}
*/
/*public 递归方法(参数列表){
if(列表的元素只有两个){
输出:“元素一元素二”
输出:“元素二元素一”
}else{
//此时元素有两个以上,这时候要使用递归
递归方法(参数列表)//使用递归方法将元素细分
}
}*/
本文档为【java 字符串全排列大全 (已解决重复问题)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。