java字符串全排列的实现方式

转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/17585499

    今天突然之间想起了自己来易查面试时的一个笔试题目,题目大致如下:求字符串s的全排列。

    其实这个题目的实现方式也就是递归调用,当时也就写了一下伪代码,今天就把完整的实现方式和大家分享下。

    下面的实现方式也存在一些小BUG,比如:对于字符串中出现相同的字符是按照不同字符去处理的,当然对于这个BUG可以将程序中的ArrayList<String> 全部修改为 HashSet<String>即可解决,但是自己通过测试,后面的效率明显比第一个低,在实际中,有时候就需要把它们当成不同的字符去对待,自己就偷懒不处理了;第二个BUG就是由于ArrayList<String>数组最大长度的限制,所以现在最大也就只能处理9个长度的字符串,修改这个应该就需要考虑另外的数据结构了。

     废话不说了,直接贴出代码:


 /**  
 *@Description:  字符串排列问题   
 */ 
package cn.lulei.util;  

import java.util.ArrayList;
  
public class StringPermutation {

	/**
	 * @param s
	 * @return
	 * @Date: 2013-12-26  
	 * @Author: lulei  
	 * @Description: 求字符串的全排列,在测试中,字符长的长度最大为9
	 * 字符串全排列的实现思想:字符串 s 的全排列是字符串 s 的子串 (s除去第一位的字符组成的字符串)的全排列结果
	 * 和字符 c (s第一个位置的字符)经过getStr(String s, char c)运算结果,如果 s 长度为 1 这其全排列结果就是本身
	 * 例如:"abcde" 的全排列结果是 "bcde" 的全排列结果和 'a' 经过getStr(String s, char c)运算得到响应的结果
	 * 由于在实现过程中使用 ArrayList 造成可以处理的字符串长度 最大只能为 9,在实现过程中,未考虑 s 中有重复字符存在情况
	 */
	public static ArrayList<String> getFullPermutation(String s) {
		if (null == s || "".equals(s)){
			return null;
		}
		ArrayList<String> array = null;
		if (s.length() == 1){
			array = new ArrayList<String>();
			array.add(s);
		} else {
			//递归调用
			array = getFullPermutation(s.substring(1), s.charAt(0));
		}
		return array;
	}
	
	/**
	 * @param s
	 * @param c
	 * @return
	 * @Date: 2013-12-26  
	 * @Author: lulei  
	 * @Description: 求字符串 s + c 的全排列结果
	 */
	public static ArrayList<String> getFullPermutation(String s, char c) {
		ArrayList<String> reArray = new ArrayList<String>();
		ArrayList<String> array = getFullPermutation(s);
		for (String str : array){
			reArray.addAll(getStr(str, c));
		}
		array = null;
		return reArray;
	}
	
	/**
	 * @param s
	 * @param c
	 * @return
	 * @Date: 2013-12-26  
	 * @Author: lulei  
	 * @Description: 将字符 c 插入到字符串的每个位置中
	 * 如: s = "ab"; c = 'c';得到的结果就是 "cab" "acb" "abc"
	 */
	public static ArrayList<String> getStr(String s, char c) {
		ArrayList<String> array = new ArrayList<String>();
		for (int i = 0; i <= s.length(); i++) {
			array.add(new StringBuffer().append(s.substring(0, i)).append(c).append(s.substring(i)).toString());
		}
		return array;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub  
		//,处理9个字符的全排列耗时  ~ 370ms 全排列结果个数  362880
		String s = "abcdefghi";
		long a = System.currentTimeMillis();
		ArrayList<String> array = StringPermutation.getFullPermutation(s);
		long b = System.currentTimeMillis();
		System.out.println(s.length() + "个字符串长度全排列耗时:" + (b -a) + "ms");
		if (array != null){
			System.out.println(array.size());
		}
	}

}

    自己如果解决了字符串长度限制的这个BUG,会在后面给出相应的blog地址。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值