允许重复的递归字符串排列

时间:2014-10-09 03:00:00

标签: java string recursion permutation

您好我正在尝试找出一种有效的方法来获取字符串的所有排列,但也允许重复字符。 (例如,对于字符串“ab”,输出将是“aa,bb,ba,ab”)

我的代码正常工作而没有重复,但我不确定如何修改它以允许重复字符,而且似乎只是想方设法做到这一点而不重复字符。

以下是我的代码:

    public static ArrayList<String> permutationsUnique(String word) {
    ArrayList<String> result = new ArrayList<String>();

    if (word.length() == 0) {
        result.add(word);
        return result;
    } else {

        for (int i = 0; i < word.length(); i++) {

            String shorter = word.substring(0, i) + word.substring(i + 1);

            ArrayList<String> shorterPermutations = permutationsUnique(shorter);

            for (String s : shorterPermutations) {
                result.add(word.charAt(i) + s);
            }
        }

        return result;
    }

}

如果有人能指导我朝着正确的方向前进,我真的很感激。

谢谢

3 个答案:

答案 0 :(得分:2)

我知道这个问题很久以前就被问过了,但我只是在一个java程序上进行了整数的排列,允许重复。我把我的代码放在这里,万一有人需要它。

该程序可以生成指定长度的排列。即 对于整数1,2和lengthOfSinglePermutation = 2,输出应为 11 21 12 22

对于整数1,2和lengthOfSinglePermutation = 3,输出应为 111 211 121 221 112 212 122 222

希望这有帮助。

    public class PermutationsWithRepetitions {

public static void main(String[] args) {
    int[] input = { 1, 2 };
    int lengthOfSinglePermutation = 3;

    // we need to check number of unique values in array
    Set<Integer> arrValues = new HashSet<Integer>();
    for (int i : input) {
        arrValues.add(i);
    }
    int noOfUniqueValues = arrValues.size();

    int[] indexes = new int[lengthOfSinglePermutation];
    int totalPermutations = (int) Math.pow(noOfUniqueValues, lengthOfSinglePermutation);

    for (int i = 0; i < totalPermutations; i++) {

        for (int j = 0; j < lengthOfSinglePermutation; j++) {
            System.out.print(input[indexes[j]]);
        }
        System.out.println();

        for (int j = 0; j < lengthOfSinglePermutation; j++) {
            if (indexes[j] >= noOfUniqueValues - 1) {
                indexes[j] = 0;
            }
            else {
                indexes[j]++;
                break;
            }
        }
    }
}
}

答案 1 :(得分:1)

对不起,我之前的回答有些不相关。删除。这肯定会奏效: -

static void Recur(String prefix, String str)
{
 if(prefix.length()==str.length())
 { 
   System.out.println(prefix); return; 
 }

   for(int i=0; i<str.length(); i++)
   Recur(prefix+str.charAt(i),str);
 }
 public static void main (String[] args)
 {
    String str = "AB";
 }

输出

AA
AB
BA
BB

答案 2 :(得分:0)

我还有一个使用char数组的解决方案,但是它适用于任何类型的数组。在这里,您可以添加列表并将元素添加到列表中,而不是打印字符(或所需的任何数据类型)。

static void permuteAll(char [] a)
{   
    permuteArray(a, new char[a.length], 0);
}

static void permuteArray(char [] a, char [] s, int j)
{
    if(j == a.length)
    {
        System.out.println(new String(s));
        return;
    }

    for(int i = 0; i < a.length; i++)
    {
        s[j] = a[i];
        permuteArray(a, s, j+1);
    }

}