DDSA Solutions

Permutations of a String

Advertisement

Intuition

Backtracking: fix each character at the current position, recurse for remaining. Use swap-based or selection approach.

Algorithm

  1. 1For each index i from current to end: swap str[i] with str[current]. Recurse on current+1. Swap back.
  2. 2When current == end: add to result.

Common Pitfalls

  • For distinct permutations: use a set to avoid duplicates, or sort and skip duplicates.
Permutations of a String.java
Java
// Approach: Backtracking with a visited boolean array or swap-based approach to generate all permutations.
// Time: O(n! * n) Space: O(n)
class Solution {
    public ArrayList<String> findPermutation(String s) {
        ArrayList<String> result = new ArrayList<>();
        char[] chars = s.toCharArray();
        Arrays.sort(chars);
        boolean[] visited = new boolean[chars.length];
        backtrack(result, new StringBuilder(), chars, visited);
        return result;
    }

    private void backtrack(ArrayList<String> result, StringBuilder current, char[] chars, boolean[] visited) {
        if (current.length() == chars.length) {
            result.add(current.toString());
            return;
        }

        for (int i = 0; i < chars.length; i++) {
            if (visited[i])
                continue; // Skip if already used
            if (i > 0 && chars[i] == chars[i - 1] && !visited[i - 1])
                continue; // Skip duplicates

            visited[i] = true;
            current.append(chars[i]);

            backtrack(result, current, chars, visited);

            current.deleteCharAt(current.length() - 1); // Backtrack
            visited[i] = false;
        }
    }
}
Advertisement
Was this solution helpful?