字符串全排列算法java实现

字符串的全排列 递归方法实现

要实现字符串全排列 我觉得像是一种分治法的感觉。比如AB只有两种 :

AB BA

到了ABC时可以抽出A 只看BC的话就是两种,然后BC全排列之后放在A后面。

随后取出B对AC全排列放在B后面

以此类推,此算法非常精美 但是位数多了全排列数量会呈指数式增长。

代码如下:


import java.util.ArrayList;
import java.util.List;


public class StringTest {


	public static void main(String[] args) {
		List<String> ls = permutations("ABCD");
		for(String s:ls){
			System.out.println(s);
		}


	}
	public static List<String> permutations(String str){
		//每一组排列都被存储在字符串列表中
		List result = new ArrayList<>();
		//基本情况
		if(str.length()==1){
			result.add(str);
		}else{
			//对字符串每一个字符执行操作
			for(int i=0;i<str.length();i++){
				//对EveryThingElse返回的字符串组合进行操作
				for(String p:permutations(EverythingElse(str, i))){
					//插入当前字符到排列中
					result.add(str.charAt(i)+p);
				}
			}
		}
		return result;
		
	}
	private static String EverythingElse(String str,int IndexToIngore){
		StringBuilder result = new StringBuilder();
		
		for(int i=0;i<str.length();i++){
			if(IndexToIngore!=i){
				result.append(str.charAt(i));
			}
		}
		return result.toString();
		
	}
}



但是这个代码有个明显的缺陷请你思考一下





就是有重复字符的话会输出重复的排列 比如AAB的时候就会有重复

所以简单办法就是使用set数据结构进行字符串的存储 他会自动去重,十分好用

import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class StringTest {

	public static void main(String[] args) {
		Set<String> set = permutations("ABC");
		for(String s:set){
			System.out.println(s);
		}

	}
	public static Set<String> permutations(String str){
		//每一组排列都被存储在字符串列表中
		Set result = new HashSet<>();
		//基本情况
		if(str.length()==1){
			result.add(str);
		}else{
			//对字符串每一个字符执行操作
			for(int i=0;i<str.length();i++){
				//对EveryThingElse返回的字符串组合进行操作
				for(String p:permutations(EverythingElse(str, i))){
					//插入当前字符到排列中
					result.add(str.charAt(i)+p);
				}
			}
		}
		return result;
		
	}
	private static String EverythingElse(String str,int IndexToIngore){
		StringBuilder result = new StringBuilder();
		
		for(int i=0;i<str.length();i++){
			if(IndexToIngore!=i){
				result.append(str.charAt(i));
			}
		}
		return result.toString();
		
	}
}


美滋滋



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值