Cracking the coding interview--Q8.4

题目

原文:

Write a method to compute all permutations of a string.

译文:

写一个方法返回一个字符串的所有排列。

解答

显然对于一个长度为n的串,它的全排列共有A(n, n)=n!种,由递归的方法解,若字符串是“abc”,函数名为recursionPermu,由不同的递归思路分析。

解法一:

将第0个字符a取出,递归调用recursionPermu求出剩余串"bc"的所有排列,为"bc","cb",再分别针对此字符串进行插空得到全部排列:abc,bac,bca,acb,cab,cba,代码如下:

public static LinkedList<String> recursionPermu(String str){
		LinkedList<String> result=new LinkedList<String>();
		if(str.equals("")){
			result.add("");
			return result;
		}
		String c=str.substring(0,1);
		LinkedList<String> res=recursionPermu(str.substring(1));
		for(int i=0;i<res.size();++i){
			String t=res.get(i);
			for(int j=0;j<=t.length();++j){
				String u=t;
				u=insertStr(u,j,c);
				result.add(u);
			}
		}
		return result;
	}
	//在指定位置插入一个字符
	public static String insertStr(String target,int index,String str){
		String targetStr="";
		if(index==0) targetStr=str+target;
		else if(index==target.length()) targetStr=target+str;
		else  targetStr=target.substring(0,index)+str+target.substring(index);
		return targetStr;
	}

解法二:

另外可以依次取字符串的每个字符,然后用recursionPermu递归求出剩余串的排列数,再在每个排列前加上该字符即可,如abc的所有排列:abc,acb,bac,bca,cab,cba,代码如下:

public static LinkedList<String> recursionPermu1(String str){
		LinkedList<String> result=new LinkedList<String>();
		if(str.equals("")){
			result.add("");
			return result;
		}
		for(int i=0;i<str.length();++i){
			String c=str.charAt(i)+"";
			String t=str;
			LinkedList<String> res=recursionPermu1(eraseStr(t,i));
			for(int j=0;j<res.size();++j){
				result.add(c+res.get(j));
			}
		}
		return result;
	}
	//删除指定位置的字符
	public static String eraseStr(String str,int index){
		if(str.equals("")) return "";
		if(index==0) return str.substring(1);
		if(index==str.length()-1) return str.substring(0,str.length()-1);
		else return str.substring(0,index)+str.substring(index+1);
	}

完整代码如下:

import java.util.LinkedList;

class Q8_4{
	public static LinkedList<String> recursionPermu(String str){
		LinkedList<String> result=new LinkedList<String>();
		if(str.equals("")){
			result.add("");
			return result;
		}
		String c=str.substring(0,1);
		LinkedList<String> res=recursionPermu(str.substring(1));
		for(int i=0;i<res.size();++i){
			String t=res.get(i);
			for(int j=0;j<=t.length();++j){
				String u=t;
				u=insertStr(u,j,c);
				result.add(u);
			}
		}
		return result;
	}
	//在指定位置插入一个字符
	public static String insertStr(String target,int index,String str){
		String targetStr="";
		if(index==0) targetStr=str+target;
		else if(index==target.length()) targetStr=target+str;
		else  targetStr=target.substring(0,index)+str+target.substring(index);
		return targetStr;
	}

	public static LinkedList<String> recursionPermu1(String str){
		LinkedList<String> result=new LinkedList<String>();
		if(str.equals("")){
			result.add("");
			return result;
		}
		for(int i=0;i<str.length();++i){
			String c=str.charAt(i)+"";
			String t=str;
			LinkedList<String> res=recursionPermu1(eraseStr(t,i));
			for(int j=0;j<res.size();++j){
				result.add(c+res.get(j));
			}
		}
		return result;
	}
	//删除指定位置的字符
	public static String eraseStr(String str,int index){
		if(str.equals("")) return "";
		if(index==0) return str.substring(1);
		if(index==str.length()-1) return str.substring(0,str.length()-1);
		else return str.substring(0,index)+str.substring(index+1);
	}

	public static void main(String[] args){
		String s="abc";
		LinkedList<String> res=recursionPermu(s);
		for(int i=0;i<res.size();i++){
			System.out.println(res.get(i));
		}
		System.out.println("");

		LinkedList<String> res1=recursionPermu1(s);
		for(int i=0;i<res1.size();i++){
			System.out.println(res1.get(i));
		}
	}
}

---EOF---


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值