面试题—有重复序列全排列问题

Posted JeemyJohn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题—有重复序列全排列问题相关的知识,希望对你有一定的参考价值。

最近面试遇到个高频面试题:有重复序列全排列问题,现在Java代码展示给大家,原理稍后有空补充。

public class Demo 
    public static void main(String[] args) 
        char a1[] = 'a', 'b', 'c';
        perm(a1, 0, 3);

        System.out.println();

        char a2[] = 'a', 'b', 'b', 'c';
        perm(a2, 0, 4);
    

    /**
     * 判断是否有重复,有重复则在递归的过程中过滤
     */
    public static boolean isSwap(char s[], int start, int end) 
        for (int i = start; i < end; i++) 
            if (s[i] == s[end]) 
                return false;
            
        
        return true;
    

    /**
     * 交换数组元素
     */
    public static void swap(char s[], int i, int j) 
        char temp = s[i];
        s[i] = s[j];
        s[j] = temp;
    

    /**
     * 递归求全排列
     */
    public static void perm(char s[], int start, int end) 
        if (start == end) 
            for (int i = 0; i < end; i++) 
                System.out.print(s[i]);
            
            System.out.println();
         else 
            for (int i = start; i < end; i++) 
                if (isSwap(s, start, i)) 
                    swap(s, i, start);
                    perm(s, start + 1, end);
                    swap(s, i, start);
                
            
        
    

以上是关于面试题—有重复序列全排列问题的主要内容,如果未能解决你的问题,请参考以下文章

面试题—有重复序列全排列问题

《程序员面试金典(第6版)》面试题 08.08. 有重复字符串的排列组合(回溯算法,全排列问题)C++

算法初级面试题08——递归和动态规划的精髓阶乘汉诺塔子序列和全排列母牛问题逆序栈最小的路径和数组累加成指定整数背包问题

luogu P1706全排列问题

全排列 II(力扣第47题)

作业2.有重复全排列和无重复全排列的区别