字符串排列组合(去重)

字符串排列组合

一、 字符串排列

要求字符串:abc产生abc |acb|bac|bca|cab|cba

思路:
1、固定一个位置第一个位置,数组中该位置之后的元素与该位置元素交换,
2、在1的基础之上,固定第二个位置,数组数组中该位置之后的元素与该位置元素交换
3、递归退出条件:当位置指针等于当前数组的长度,返回当前字符串排序
4、递归:
(1)交换元素
(2)递归调用下一位置
(3)将数组还原
5、去重方式
(1)通过Hashset去重
(2)通过增加isSwap()//目的在于判断当前位置的元素在前边数组中已经已经出现

补充,由于本人在牛客测试,由于最终结果与标准结果顺序存在差别,可以自己添加比较器

class Compare implements Comparator<String> {
	@Override
	public int compare(String o1, String o2) {
	 	 return o1.compareTo(o2);
   		}
  }

代码

import java.util.ArrayList;
import java.util.HashSet;
class Permutation {
	ArrayList<String> list = new ArrayList<>();
	HashSet<String> set = new HashSet<>();
	//主函数
	public ArrayList<String> Permutation(String str) {
		char[] c = str.toCharArray();
		int pointer = 0;
		oper(pointer, c);
		return list;
	}
	/**
	 * 字符串排列并去重
	 * 
	 * @param pointer
	 * @param c
	 */
	public void oper(int pointer, char[] c) {
		if (pointer == c.length) {
			String end = String.valueOf(c);
			if (!set.contains(end)) {
				list.add(end);
				set.add(end);
			}
		} else {
			for (int i = pointer; i < c.length; i++) {
				swap(c, pointer, i);
				oper(pointer + 1, c);
				swap(c, i, pointer);

			}
		}
	}
}

二、字符串组合

要求:abc==>a|b|c|ab|ac|bc|abc

1、定义空字符串用来存储递归跳出的的结果
2、递归跳出条件:指针等于数组长度(需要将字符串转化为字符数组)
3、递归函数:
(1)下一个字符串不包含当前位置元素
(2)下一个字符串包含当前位置元素
4、去重:通过HashSet去重

代码

import java.util.ArrayList;
import java.util.HashSet;
class Permutation {
	ArrayList<String> listc = new ArrayList<>();
	HashSet<String> setc = new HashSet<>();
	//主函数
	public ArrayList<String> Combination(String str) {
		char[] c = str.toCharArray();
		int pointer = 0;
		combin(c, pointer,"");
		listc.remove("");
		return listc;
	}
	/**
	 * 字符串组合
	 * @param str
	 * @param pointer
	 */

	private void combin(char[] c, int pointer,String res) {
		if(pointer == c.length ) {
			if(!setc.contains(res)){
				listc.add(res);
				setc.add(res);
				return ;
			}	
		}else{
			combin(c, pointer+1, res+c[pointer]);//下一个包含该字符串
			combin(c, pointer+1, res);//下一个不包含该字符串
		}
		
	}
}

测试

public static void main(String[] args) {
		String string = "aab";
		Permutation per = new Permutation();
		ArrayList<String> res = per.Permutation(string);
		System.out.println("==============字符串排列==============");
		for (String str : res) {
			System.out.print(str + "|");
		}
		System.out.println();
		
		ArrayList<String> com = per.Combination(string);
		System.out.println("==============字符串组合==============");
		for (String str : com) {
			System.out.print(str + "|");
		}
	}```

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值