字符串排列问题

  1. 使用set去重,为了保证有序性使用TreeSet存储结果;
  2. 排列问题:讲究顺序(即 [2, 2, 3] 与 [2, 3, 2] 视为不同列表时),需要记录哪些数字已经使用过;【如果数组不包含重复元素,可以使用track.contains(nums[i])来排除已经添加过的元素】
  3. 在添加到res中时,一定要注意是:res.add(new LinkedList(track)); 或res.add(track.toString()); 使用res.add(track)相当于add了一个引用,故而会改变、是错误的
import java.util.*;
public class Solution {
    Set res = new TreeSet();// 去重
    public ArrayList Permutation(String str) {
        char[] c = str.toCharArray();
        StringBuilder sb = new StringBuilder();
        boolean[] used = new boolean[str.length()];
        helper(c,sb,used);
        return new ArrayList(res);
    }
    void helper(char[] c, StringBuilder track, boolean[] used){
         if(track.length() == c.length){
             res.add(track.toString()); 
             return;
         }   
         for(int i = 0; i < c.length;i++){
             if(used[i]) continue;
             track.append(c[i]);
             used[i] = true;
             helper(c,track,used);
             used[i] = false;
             track.deleteCharAt(track.length()-1);
         }
    }
}