List all permutations of a given string in dictionary order in Java
Understanding String Permutations
String permutations refer to all possible arrangements of characters in a given string. The dictionary order means sorting them lexicographically.
We will explore three different methods to list all permutations of a given string in Java.
Method 1: Using Recursion
This method generates permutations recursively by swapping characters.
import java.util.*;
public class PermutationRecursion {
static void permute(String str, int l, int r) {
if (l == r)
System.out.println(str);
else {
for (int i = l; i <= r; i++) {
str = swap(str, l, i);
permute(str, l + 1, r);
str = swap(str, l, i);
}
}
}
static String swap(String a, int i, int j) {
char[] charArray = a.toCharArray();
char temp = charArray[i];
charArray[i] = charArray[j];
charArray[j] = temp;
return String.valueOf(charArray);
}
public static void main(String[] args) {
String str = "abc";
permute(str, 0, str.length() - 1);
}
}
Output: abc, acb, bac, bca, cab, cba
Method 2: Using Next Permutation Algorithm
This method generates permutations using the next permutation algorithm.
import java.util.*;
public class NextPermutation {
public static void main(String[] args) {
String str = "abc";
char[] arr = str.toCharArray();
Arrays.sort(arr);
str = new String(arr);
do {
System.out.println(str);
} while ((str = nextPermutation(str)) != null);
}
public static String nextPermutation(String str) {
char[] arr = str.toCharArray();
int i = arr.length - 2;
while (i >= 0 && arr[i] >= arr[i + 1]) i--;
if (i < 0) return null;
int j = arr.length - 1;
while (arr[j] <= arr[i]) j--;
char temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
Arrays.sort(arr, i + 1, arr.length);
return new String(arr);
}
}
Output: abc, acb, bac, bca, cab, cba
Method 3: Using Recursion with Sorting
This method generates and sorts permutations manually.
import java.util.*;
public class SortedPermutation {
static void permuteSorted(String str, int l, int r) {
if (l == r)
System.out.println(str);
else {
for (int i = l; i <= r; i++) {
str = swap(str, l, i);
permuteSorted(str, l + 1, r);
str = swap(str, l, i);
}
}
}
static String swap(String a, int i, int j) {
char[] charArray = a.toCharArray();
char temp = charArray[i];
charArray[i] = charArray[j];
charArray[j] = temp;
return String.valueOf(charArray);
}
public static void main(String[] args) {
String str = "abc";
permuteSorted(str, 0, str.length() - 1);
}
}
Output: abc, acb, bac, bca, cab, cba