I am willing to create a program that outputs all the possible permutations of a string. For example:
Input
abc
Output
abc
acb
bac
bca
cab
cba
I am able to get this output when I use String in java, but I am curious do the same using StringBuilder in java.
I used the following code to do get this output.
public class Test {
public static void permutations(String str, String ans) {
if (str.length() == 0) {
System.out.println(ans);
return;
}
for (int i = 0; i < str.length(); i++) {
String newStr = str;
newStr = newStr.substring(0, i) + newStr.substring(i + 1);
permutations(newStr, ans + str.charAt(i));
}
}
public static void main(String[] args) {
permutations("abc", ""); // using String
}
}
I tried to create a similar method that resembles in structure with my permutation method and takes StringBuilder as parameter and work for it, but I am unable to do so, it shows me StringIndexOutOfBound Exception etc.
I am sharing the method I built below.
public static void permutationsStringBuilder(StringBuilder str, StringBuilder ans) {
if (str.length() == 0) {
System.out.println(ans);
return;
}
StringBuilder newstr = new StringBuilder(str);
for (int i = 0; i < str.length(); i++) {
try {
ans.append(str.charAt(i));
newstr.deleteCharAt(i);
permutationsStringBuilder(newstr, ans);
ans.deleteCharAt(i);
newstr.replace(i, i, ""+str.charAt(i));
} catch (StringIndexOutOfBoundsException e) {
}
}
}
Output this is returning is:
abc
ccb
bac
cca
Please help me with this. Assist me make it work using StringBuilder of Java.
After the recursive call, you need to reset each StringBuilder
to its original state before the loop iteration.
ans
, the last character should be removed.newstr
was removed, so it should be added back at the correct position.ans.append(str.charAt(i));
newstr.deleteCharAt(i);
permutationsStringBuilder(newstr, ans);
ans.deleteCharAt(ans.length() - 1);
newstr.insert(i, str.charAt(i));