如果我使用交换和排列方法生成排列,我可以处理重复的问题,如此处所示。
然而,我使用了一种不同的方法,在不包括当前字符的所有生成排列中,在任意两个字符之间,放置当前字符在起始位置和结束位置。
如何修改下面的代码,使其只返回一个包含重复字符的字符串的唯一排列。
import java.util.ArrayList;
public class Permutations {
public static void main(String[] args) {
String str = "baab";
System.out.println(fun(str, 0));
System.out.println("number of Permutations =="+fun(str, 0).size());
}
static ArrayList<String> fun(String str, int index)
{
if(index == str.length())
{
ArrayList<String> al = new ArrayList<String>();
al.add("");
return al;
}
/* get return from lower frame */
ArrayList<String> rec = fun(str, index+1);
/* get character here */
char c = str.charAt(index);
/* to each of the returned Strings in ArrayList, add str.charAt(j) */
ArrayList<String> ret = new ArrayList<String>();
for(int i = 0;i<rec.size();i++)
{
String here = rec.get(i);
ret.add(c + here);
for(int j = 0;j<here.length();j++)
ret.add(here.substring(0,j+1) + c + here.substring(j+1,here.length()));
}
return ret;
}
}
目前,“bab”这样的字符串会产生以下输出,其中包含多次出现的“abb”和“bba”。
[bab, abb, abb, bba, bba, bab]
number of Permutations ==6
注意:我不想使用哈希映射/集合来跟踪我的重复项并查看是否先前遇到。