剑指offer---字符串的排列

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

使用DFS来做,因为其中会有重复的情况出现,所以不能简单的使用set的方式,而是要使用访问次序的方式来处理

java

import java.util.ArrayList;
import java.util.Arrays;

public class Solution {
    public ArrayList Permutation(String str) {
       ArrayList result = new ArrayList<>();
        if (str == null || str.length() == 0) {
            return result;
        }
        char[] arr = str.toCharArray();
        Arrays.sort(arr);
        boolean[] visit = new boolean[arr.length];
        dfs(arr, visit, result, new StringBuffer());
        return result;
    }
    private void dfs(char[] arr, boolean[] visit, ArrayList result, StringBuffer sb) {
        if (sb.length() == arr.length) {
            result.add(sb.toString());
            return;
        }
        for (int i = 0; i < arr.length; i++) {
            if (visit[i] == true) {
                continue;
            }
            if (i != 0 && arr[i] == arr[i - 1] && visit[i - 1] == false) {
                continue;
            }
            visit[i] = true;
            sb.append(arr[i]);
            dfs(arr, visit, result, sb);
            sb.deleteCharAt(sb.length() - 1);
            visit[i] = false;
        }
    }
}



你可能感兴趣的:(剑指offer)