Java 查找字符串的置换总数
我试图用以下程序计算给定字符串的置换总数: 节目Java 查找字符串的置换总数,java,algorithm,arraylist,permutation,Java,Algorithm,Arraylist,Permutation,我试图用以下程序计算给定字符串的置换总数: 节目 class Test{ public static void main(String[] args){ String str = "ABC"; int n = str.length(); //System.out.println(permute(str, 0, n-1)); permute(str, 0, n-1); } private stat
class Test{
public static void main(String[] args){
String str = "ABC";
int n = str.length();
//System.out.println(permute(str, 0, n-1));
permute(str, 0, n-1);
}
private static int permute(String str, int l, int r){
ArrayList<String> list=new ArrayList<String>();
if (l == r)
//System.out.println(str);
list.add(str);
else
{
for (int i = l; i <= r; i++)
{
str = swap(str,l,i);
permute(str, l+1, r);
str = swap(str,l,i);
}
}
/*for (int i=0;i<list.size() ;i++ ) {
System.out.println(list.get(i));
}*/
return list.size();
}
public static String swap(String a, int i, int j){
char temp;
char[] charArray = a.toCharArray();
temp = charArray[i] ;
charArray[i] = charArray[j];
charArray[j] = temp;
return String.valueOf(charArray);
}
}
class Test{
public static void main(String[] args){
String str = "ABC";
int n = str.length();
//System.out.println(permute(str, 0, n-1));
permute(str, 0, n-1);
}
private static void permute(String str, int l, int r){
ArrayList<String> list=new ArrayList<String>();
if (l == r)
//System.out.println(str);
list.add(str);
else
{
for (int i = l; i <= r; i++)
{
str = swap(str,l,i);
permute(str, l+1, r);
str = swap(str,l,i);
}
}
for (int i=0;i<list.size() ;i++ ) {
System.out.println(list.get(i));
}
//return list.size();
}
public static String swap(String a, int i, int j){
char temp;
char[] charArray = a.toCharArray();
temp = charArray[i] ;
charArray[i] = charArray[j];
charArray[j] = temp;
return String.valueOf(charArray);
}
}
我的疑问在于,当我试图返回arraylist
的大小时,我得到0
作为我的输出,但当我打印出列表的所有元素时,它显示了所有排列
有人能澄清我的疑问吗?在方法中创建列表是不正确的。由于递归,您将在最后获得一个空列表。
您现在能做的最快修复就是在方法中传递ArrayList
private static int permute(String str, int l, int r, ArrayList<String> list){
if (l == r) {
list.add(str);
}
else {
for (int i = l; i <= r; i++) {
str = swap(str,l,i);
permute(str, l+1, r, list);
str = swap(str,l,i);
}
}
return list.size();
}
这样使用它:
int i = numberOfPermutations("abc".length());
System.out.println(i);
更新
建议您,如果字符串中的chars
重复,请使用另一个公式n!/(k1!*k2!*k3!…)
。植入:
String string = "ABBCCCD";
String[] split = string.split("");
Map<String, Long> collect = Arrays.stream(split).collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
long result = numberOfPermutations(string.length()) / collect.values().stream().map(Main::numberOfPermutations).reduce(1L, (a, b) -> a *b);
System.out.println(result);
String String=“abbccd”;
String[]split=String.split(“”);
Map collect=Arrays.stream(split.collect)(Collectors.groupingBy(Function.identity(),Collectors.counting());
long result=numberOfPermutations(string.length())/collect.values().stream().map(Main::numberOfPermutations).reduce(1L,(a,b)->a*b);
系统输出打印项次(结果);
这是因为您正在permute方法中创建一个新的列表对象。将您的列表设置为全局变量。您是否知道,不需要生成所有排列来获取其编号?谢谢您的帮助@MBo,不,我不知道我们可以在不生成所有置换的情况下得到置换的数量。你能告诉我怎么做吗?@Pritom Mazumdar,我编辑了答案,你可以看看。排列的数量是n代码>用于所有不同的字符。如果其中一些是重复的,那么公式是n!/(k1!*k2!*k3!…)
式中,k[i]是每种煤焦的数量。例如,对于abbccd
,结果是7!/(2!*3!)
@MBo,是的,你是对的,应该问这个问题。对我来说,在通常情况下,排列问题涉及不同的字符。我将编辑答案,谢谢
private static long numberOfPermutations(long n) {
if(n == 1 || n == 0) return 1;
return (n) * numberOfPermutations(n-1);
}
int i = numberOfPermutations("abc".length());
System.out.println(i);
String string = "ABBCCCD";
String[] split = string.split("");
Map<String, Long> collect = Arrays.stream(split).collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
long result = numberOfPermutations(string.length()) / collect.values().stream().map(Main::numberOfPermutations).reduce(1L, (a, b) -> a *b);
System.out.println(result);