package com.thealgorithms.strings; import java.util.HashSet; import java.util.Set; /** * This class provides methods for generating all permutations of a given string using a backtracking algorithm. *

* The algorithm works as follows: *

    *
  1. Fix a character in the current position and swap it with each of the remaining characters. * For example, for the string "ABC": * *
  2. *
  3. Repeat the process for the next character. * For instance, after fixing 'B' in the second position: * *
  4. *
  5. After generating permutations for the current position, backtrack by swapping the characters back to their original positions to restore the state. * For example, after generating permutations for "ABC", swap back to restore "BAC" and continue with further permutations.
  6. *
  7. Repeat the process for all characters to get all possible permutations.
  8. *
*

*/ public final class PermuteString { private PermuteString() { } /** * Generates all possible permutations of the given string. * *

This method returns a set containing all unique permutations of the input string. It leverages * a recursive helper method to generate these permutations. * * @param str The input string for which permutations are to be generated. * If the string is null or empty, the result will be an empty set. * @return A {@link Set} of strings containing all unique permutations of the input string. * If the input string has duplicate characters, the set will ensure that only unique permutations * are returned. */ public static Set getPermutations(String str) { Set permutations = new HashSet<>(); generatePermutations(str, 0, str.length(), permutations); return permutations; } /** * Generates all permutations of the given string and collects them into a set. * * @param str the string to permute * @param start the starting index for the current permutation * @param end the end index (length of the string) * @param permutations the set to collect all unique permutations */ private static void generatePermutations(String str, int start, int end, Set permutations) { if (start == end - 1) { permutations.add(str); } else { for (int currentIndex = start; currentIndex < end; currentIndex++) { // Swap the current character with the character at the start index str = swapCharacters(str, start, currentIndex); // Recursively generate permutations for the remaining characters generatePermutations(str, start + 1, end, permutations); // Backtrack: swap the characters back to their original positions str = swapCharacters(str, start, currentIndex); } } } /** * Swaps the characters at the specified positions in the given string. * * @param str the string in which characters will be swapped * @param i the position of the first character to swap * @param j the position of the second character to swap * @return a new string with the characters at positions i and j swapped */ private static String swapCharacters(String str, int i, int j) { char[] chars = str.toCharArray(); char temp = chars[i]; chars[i] = chars[j]; chars[j] = temp; return new String(chars); } }