笔试题:写出 字符abc 的全排列(不重复)和所有组合

1、问题一:

给定一个字符串,满足正则表达式[a-zA-Z]+,打印 这个字符串的全排列,结果顺序不限。例如,输入为abc,输出为:

abc acb bac bca cba cab

递归解法一:

import java.util.ArrayList;
import java.util.List;
 
public class LetterCombination {
	public static void main(String[] args){
        String str = "abc";
        List<String> result = new ArrayList<String>();
        getAllLists(result,str,"");
        for(String each : result){
            System.out.println(each);
        }
    }
	/**   
	* @param base 以该字符串作为基础字符串,进行选择性组合。  
	* @param buff 所求字符串的临时结果  
	* @param result 存放所求结果  
	*/
	public static void getAllLists(List<String> result, String base, String buff){
        if(base.length() <= 0){
            result.add(buff.toString());
        }
        for(int i = 0; i < base.length(); i++){
            getAllLists(result, new StringBuilder(base).deleteCharAt(i).toString(),
                    buff + base.charAt(i));
        }
    }
}

递归解法二:

/**
 * Created by FHY on 2019/4/10.
 */
public class FullPermutationDemo {
    public static void main(String[] args){
        String str = "aac";
        List<String> result = new ArrayList<>();
        getAllList(result, str.toCharArray(), 0);
        for(String each : result){
            System.out.println(each);
        }
    }
    public static void getAllList(List<String> result, char[] strs, int begin){
        if(begin == strs.length-1){
            result.add(String.valueOf(strs));
        }
        for(int i = begin; i < strs.length; i++){
            swap(strs, i, begin);
            getAllList(result, strs, begin+1);
            swap(strs, i, begin);
        }
    }

    private static void swap(char[] strs, int index1, int index2) {
        char temp = strs[index1];
        strs[index1] = strs[index2];
        strs[index2] = temp;
    }
}

有些公司的笔试题里面会继续问,如果以上字符串中有重复的字符,如何用尽量省时间和空间的方式,让输出的全排列没有重复?

答:我想到的思路是将  解法一中:的List改为Set, 同时将ArrayList改为HashSet,这样保证了输出不重复的要求,附上改为Set后的代码:

答:解法二中,放入list中时,加上判断 :  !result.contains(String.valueOf(strs))

2、问题二

求输入字符串的全排列,如:输入"ABC", 输出:A  B  C  AB  AC  BC  ABC

代码如下:

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

/**
 * Created by FHY on 2019/4/10.
 */
public class TestCombination {
    public static void main(String[] args){
        String str = "ABC";
        List<String> result = new ArrayList<String>();
        StringBuilder sb = new StringBuilder();
        char[] strs = str.toCharArray();
        for(int i = 1; i<= strs.length; i++){
            getCombination(str.toCharArray(), 0, i, result, sb);
        }

    }

    /**
     * @param strs 输入的字符串
     * @param begin 从字符串中哪个元素选起
     * @param len 本次组合的长度
     * @param result 存放所有组合的集合
     * @param sb 存放每一次已选择的元素
     */
    public static void getCombination(char[] strs, int begin, int len, List<String> result, StringBuilder sb){

        if(len == 0){
            result.add(sb.toString());
            return;
        }
        if(begin >= strs.length)
            return;

        sb.append(strs[begin]); //选择第一个字符
        getCombination(strs, begin + 1, len - 1, result, sb);  //从剩下的n-1个字符中选择len-1个字符
        sb.deleteCharAt(sb.length() - 1); // 取消选择第一个字符
        getCombination(strs, begin + 1, len, result, sb); //从剩下的n-1个字符中选择len个字符。
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值