剑指offer38.字符串的排列

剑指offer38.字符串的排列_第1张图片

 

class Solution {
    List rec;
    boolean[] vis;
    public String[] permutation(String s) {
       int n = s.length();
       rec = new ArrayList();
       vis = new boolean[n];
       char[] arr = s.toCharArray();
       Arrays.sort(arr);
       StringBuffer perm = new StringBuffer();
       backtrace(arr, 0, n, perm);
       int size = rec.size();
       String[] ans = new String[size];
       rec.toArray(ans);
       return ans;
    }
    
    public void backtrace(char[] arr, int i, int n, StringBuffer perm){
        if(i == n){
            rec.add(perm.toString());
            return;
        }
        for(int j=0;j0 && !vis[j-1] && arr[j] == arr[j-1])){
             continue;
         }
        vis[j] = true;
        perm.append(arr[j]);
        backtrace(arr, i+1, n, perm);
        perm.deleteCharAt(perm.length()-1);
        vis[j] = false;
        }
    }
}

利用回溯的方法,定义backtrace(i, prem),表示当前的排列时prem,下一个待排列的时第i个空位,这个递归分两种情况:

如果i=n,说明排完了,直接加入答案数组中。如果i

但是如果里面右重复的字符,那么答案里面肯定会有重复,所以,先把这个字符数组按字典序排序,这样的话相同的字符就排在一起,每次只加相同字符的第一个就可以,所以如果一个字符和它前面的字符相同且前面按个字符还没有加进去,那么这个字符就不能加进去。

添加一个答案之后递归开始一层一层返回的时候,要把prem一个一个清空,把vis重新设置为false。

你可能感兴趣的:(剑指offer,算法,leetcode,java)