题解 | #字符串的排列#
字符串的排列
http://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7
字符串排列问题
- 使用set去重,为了保证有序性使用TreeSet存储结果;
- 排列问题:讲究顺序(即 [2, 2, 3] 与 [2, 3, 2] 视为不同列表时),需要记录哪些数字已经使用过;【如果数组不包含重复元素,可以使用track.contains(nums[i])来排除已经添加过的元素】
- 在添加到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); } } }