思路:序列化就是回溯算法,中左右,注意返回的是字符串;反序列化就是先把字符串通过“,”分隔开,用到队列建立二叉树。
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
if (root == null)
return "null,";
// StringBuilder sb = new StringBuilder();
String res = root.val + ",";
res += serialize(root.left);
res += serialize(root.right);
return res;
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
String[] arr = data.split(",");
Queue<String> queue = new LinkedList<String>();
for (int i=0;i<arr.length;i++){
queue.offer(arr[i]);
}
return help(queue);
}
private TreeNode help(Queue<String> queue){
String val = queue.poll();
if (val.equals("null"))
return null;
TreeNode root = new TreeNode(Integer.valueOf(val));
root.left = help(queue);
root.right = help(queue);
return root;
}
}
思路:其实还是个回溯算法,就是刚开始没想明白
public String[] permutation(String s) {
HashSet<String> set = new HashSet<>();
dfs(new boolean[s.length()],s,new StringBuilder(),set);
return set.toArray(new String[set.size()]);
}
public void dfs(boolean[] status,String s,StringBuilder temp,HashSet<String> set){
if (temp.length() == status.length){
set.add(temp.toString());
return;
}
for (int i=0;i<status.length;i++){
if (!status[i]){
status[i] = true;
temp.append(s.charAt(i));
dfs(status,s,temp,set);
//回溯
status[i] = false;
temp = temp.deleteCharAt(temp.length()-1);
}
}
}