String Permutation II

Given a string, find all permutations of it without duplicates.

Have you met this question in a real interview? Yes
Example
Given "abb", return ["abb", "bab", "bba"].

Given "aabb", return ["aabb", "abab", "baba", "bbaa", "abba", "baab"].

Tags Expand

String Permutation Recursion

思路

  • 跟permutation差不多
  • 注意去重
  • 既然有了visited,就利用visited进行判断,如果char[i] == char[i-1] 而i-1还没走过,那么一定是重复的
  • 如果相邻两个数相等,而且上一个没被访问过,那么一定不是从上一层下来的,就是在本层里的循环,这样会导致重复
  • permutation 里边是使用index进行去重,有了visted就更容易
public class Solution {
    /**
     * @param str: A string
     * @return: all permutations
     */
    public List<String> stringPermutation2(String str) {
        // write your code here
        List<String> results = new ArrayList<String>();

        if (str == null || str.length() == 0) {
            results.add("");
            return results;
        }

        boolean[] visited = new boolean[str.length()];
        char[] chars = str. toCharArray();
        Arrays.sort(chars);

        helper(results, visited, chars, new StringBuilder(""));

        return results;
    }

    public void helper(List<String> results, boolean[] visited, char[] chars, StringBuilder sb) {

        if (sb.length() == chars.length) {
            String target = sb.toString();
            results.add(target);
            return;
        }

        for (int i = 0; i < chars.length; i++) {
            if (visited[i]) {
                continue;
            }

            if (i >= 1 && chars[i] == chars[i - 1] && !visited[i - 1]) {
                continue;
            }

            sb.append(chars[i]);
            visited[i] = true;
            helper(results, visited, chars, sb);
            visited[i] = false;
            sb.setLength(sb.length() - 1);
        }
    }
}

results matching ""

    No results matching ""