字符串的排列与组合

在做编程题时经常遇到字符串的排列与组合问题,特此总结一下

1.字符的全排列(无重复字符)

    /**
	 * 字符串的全排列,无重复字符
	 * @param list 字符数组
	 * @param n 当前交换的位置(初始为0)
	 */
	public static void permute(char[] list,int n){
		if(n==list.length){
			for(int i=0;i<list.length;i++)
				System.out.print(list[i]);
			System.out.println();
			return ;
		}
		for(int i=n;i<list.length;i++){
			swap(list, i, n);
			permute(list, n+1);
			swap(list, i, n);
		}
	}
	
	public static void swap(char[] list,int a,int b){
		char c = list[a];
		list[a] = list[b];
		list[b] = c;
	}

2.字符的全排列(含重复字符)

    /**
	 * 字符串的全排列(含重复字符)
	 * @param list 字符数组
	 * @param n 当前交换的位置(初始为0)
	 */
	public static void permute(char[] list,int n){
		if(n==list.length){
			for(int i=0;i<list.length;i++)
				System.out.print(list[i]);
			System.out.println();
			return ;
		}
		for(int i=n;i<list.length;i++){
            //如果是重复字符,则不进行交换
			if(list[i]==list[n]&&i!=n)
				continue;
			swap(list, i, n);
			permute(list, n+1);
			swap(list, i, n);
		}
	}
	
	public static void swap(char[] list,int a,int b){
		char c = list[a];
		list[a] = list[b];
		list[b] = c;
	}

3.字符的组合(无重复字符)

public class Test {
	//存储字符
	static ArrayList<Character> stack = new ArrayList<>();
	
	public static void main(String[] args) {
		String str = "1234";
	
		for(int i=0;i<str.length();i++){
			combine(str.toCharArray(), 0,str.length(), i);
		}
	}
	
	/**
	 * 字符的组合(无重复字符)
	 * @param list 字符数组
	 * @param start 起始的下标(初始为0)
	 * @param m 数组长度
	 * @param n 当前组合的字符数 (从1到m)
	 */
	public static void combine(char[] list,int start,int m,int n){
		if(start>=m||n<0)
			return;
		//添加第一个字符
		stack.add(list[start]);
		if(n==0)
			System.out.println(stack);
		combine(list, start+1, m, n-1);
				
		//没有添加第一个字符
		stack.remove(stack.size()-1);
		combine(list, start+1, m, n);
	}
}

4.字符组合(含重复字符)

public class Test {
	
	static StringBuilder sb = new StringBuilder();
	static ArrayList<String> ans = new ArrayList<>();
	
	public static void main(String[] args) {
		String str = "1223";
		
		for(int i=0;i<str.length();i++){
			combine(str.toCharArray(), 0,str.length(), i);
		}
		System.out.println(ans);
	}
	
	/**
	 * 字符的组合(无重复字符)
	 * @param list 字符数组
	 * @param start 起始的下标(初始为0)
	 * @param m 数组长度
	 * @param n 当前组合的字符数 (从1到m)
	 */
	public static void combine(char[] list,int start,int m,int n){
		if(start>=m||n<0)
			return;
		//添加第一个字符
		sb.append(list[start]);
		if(n==0){
			String str = sb.toString(); 
			if(!ans.contains(str))
				ans.add(str);
		}
		combine(list, start+1, m, n-1);
				
		//没有添加第一个字符
		sb.deleteCharAt(sb.length()-1);
		combine(list, start+1, m, n);
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值