黑马程序员技术交流社区
标题:
算法题, 请问如何实现字符串的全排列?
[打印本页]
作者:
张耀扬
时间:
2014-4-3 21:51
标题:
算法题, 请问如何实现字符串的全排列?
输入字符串.无重复字符.如何设计算法实现其全排列? 如输入abc. 要求输出 abc acb cba cab bac bca
作者:
血剑无痕
时间:
2014-4-3 23:00
这种问题其实想想就会了不过这中算法要好好看下
@Test
public void test() throws Exception
{
String str ="abc";
String ch1 ="";
String ch2="";
String ch3="";
for(int i=0;i<3;i++)
{ char[] ch={'a','b','c'};
ch1=ch[i]+"";
for(int n=0;n<3;n++)
{
ch2=ch[n]+"";
for(int m=0;m<3;m++)
{
ch3=ch[m]+"";
System.out.println(ch1+ch2+ch3);
}
}
}
}
作者:
911趣购
时间:
2014-4-4 01:48
package com.itheima;
import java.io.*;
public class Test7 {
public static void main(String[] args)throws IOException {
String s="abc";//定义一个字符串
for(int i=0;i<s.length();i++)//循环字符串的长度
{
String str=s.substring(i,i+1);//将字符串分割
System.out.print('"'+str+'"'+" ");//打印分割后的字符串
}
System.out.println();//单字符完成后打印换行
for(int i=0;i<s.length();i++)//二次循环字符串的长度
{
String s1=s.substring(i,i+1);//将二次循环后的字符串分割
for(int j=0;j<s.length();j++)//再次循环分割后的字符串
{
String s2=s.substring(j,j+1);//再分割
String s3;//定义个字符接收
if(s1.equals(s2))//如果循环前的和分割后的相等,就继续
{
continue;
}else{//否则就组合
s3=s1+s2;
}
System.out.print('"'+s3+'"'+" ");//打印组合后的情况
}
}
System.out.println();//二次循环后打印换行
for(int i=0;i<s.length();i++)//三次循环字符串的长度
{
String s1=s.substring(i,i+1);//三次分割字符串
for(int j=0;j<s.length();j++)
{
String s2=s.substring(j,j+1);;
String s3;
if(s1.equals(s2))
{
continue;
}else{
s3=s1+s2;
}
for(int k=0;k<s.length();k++)
{
String s4=s.substring(k,k+1);
String s5;
if(s2.equals(s4)||s1.equals(s4))//如果两次循环后的都相等,就继续,否则就再次进行组合
{
continue;
}else{
s5=s4+s3;
}
System.out.print('"'+s5+'"'+" ");
}
}
}
}
}
复制代码
看懂这个 你那个就会了。。。。。
作者:
chen_x
时间:
2014-4-4 15:37
自己写的用递归实现无重复字符串全排列的方法,希望有用,可以共同讨论下~
/*
思路:基本就是按照数学中排列组合的原理,对多个字符排列时,第一个位置上可以选取全部字符,
第二个位置上可取除去第一个位置上字符的剩余所有字符,依次类推。。。
*/
import java.lang.*;
import java.util.*;
class Test8{
public static void main(String[] args){
String str="abc";
System.out.println((all(str)).size());
System.out.println(all(str));
}
public static ArrayList all(String str){
ArrayList<String> al=new ArrayList<String>();
if(str.length()==1){
al.add(str);
return al;
}else{
char[] ch=str.toCharArray();
for(int i=0;i<ch.length;i++){//对排列第1个位置上的可取字符进行遍历
String sub=str.replace(ch[i]+"","");
ArrayList arr=all(sub); //递归对除去第1个位置上字符的剩余子串进行排列
Iterator<String> it=arr.iterator();
while(it.hasNext()){
String s=new String();
//String ss=it.next();
String re=it.next()+ch[i];//合起来就是整个字符串了
al.add(re);
}
}
return al;
}
}
}
复制代码
运行结果是
6
[cba, bca, cab, acb, bac, abc]
复制代码
ps: 主函数中是直接打印的返回的ArraryList对象,还可修改下打印的更好看点;这个代码应该是对任意长度的字符串都是适用的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2