我知道这个问题之前已经在stackoverflow得到了回答,但是我要求这不要告诉我正确的代码,而是因为我想知道我做错了什么。
public static void printCombinations(String str){
printCombinations(str, 0, str.length()-1);
}
public static void printCombinations(String str,int k,int n){
if(k == n)
System.out.println(str);
else {
for(int i=k;i<n;i++){
String tmp=modifyString(str,i,k);
printCombinations(tmp,k+1,n);
modifyString(str,i,k);
}
}
}
public static String modifyString(String str,int x,int y){
// for swapping characters inside a string
char arr[]=str.toCharArray();
char t= arr[x];
arr[x]=arr[y];
arr[y]=t;
String s= new String(arr);
return s;
}
我将该函数称为printCombinations(s)
。
答案 0 :(得分:7)
更改
i<n to i<=n
它应该有用。
答案 1 :(得分:1)
我正在考虑@CSSS代码并进行了一些更改,以便初学者非常清楚。 你只需要转储这段代码就可以运行了。我工作正常。谢谢@CSSS。 @CSSS的代码提供了不必要的重复排列,以避免我使用过 HashSet,对于每次迭代,我都将相应的排列添加到HashSet。我们知道Set实现不允许重复。所以它给出了正确的结果。在MyClass
中class Myclass
{
static Set<String> resultSet=new HashSet<String>();
public static void main(String[] args){
String str=new Scanner(System.in).next();
printCombinations(str, 0, str.length(),resultSet);
Object[] finalArray=resultSet.toArray();
int i=1;
for(Object s:finalArray){
System.out.println(s.toString()+"\t"+i++);
}
}
public static void printCombinations(String str,int k,int n,Set<String> resultSet){
for(int i=k;i<n;i++){
String temp=modifyString(str,i,k);
resultSet.add(temp);
printCombinations(temp,k+1,n,resultSet);
}
}
public static String modifyString(String str,int x,int y){
char arr[]=str.toCharArray();
char t= arr[x];
arr[x]=arr[y];
arr[y]=t;
String s= new String(arr);
return s;
}
}
答案 2 :(得分:0)
函数modifyString
不会修改它返回修改后的字符串的字符串 - 也许你想重命名它。
你打电话给它两次 - 也许第二次应该用输出做什么?
你想要达到什么目标?
答案 3 :(得分:0)
这对我有用..
import java.util.Arrays;
import java.util.Set;
import java.util.HashSet;
public class StringPermutations{
private static Set<String> uniqueResultSet = new HashSet<String>();
public static void main(String args[]) {
String inputString = "ABC";
permute(inputString.toCharArray(), 0, inputString.length()-1);
System.out.println(uniqueResultSet);
}
public static void permute(char[] ary, int startIndex, int endIndex) {
if(startIndex == endIndex){
uniqueResultSet.add(String.valueOf(ary));
}else{
for(int i=startIndex;i<=endIndex;i++) {
swap(ary, startIndex, i );
permute(ary, startIndex+1, endIndex);
swap(ary, startIndex, i );
}
}
}
public static void swap(char[] ary, int x, int y) {
char temp = ary[x];
ary[x] = ary[y];
ary[y] = temp;
}
}