import java.util.*;
/**
* NC190 字符串的全部子序列
* @author d3y1
*/
public class Solution {
// 哈希
private HashSet<String> set = new HashSet<>();
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return string字符串一维数组
*/
public String[] generatePermutation (String s) {
return solution1(s);
// return solution2(s);
}
/**
* 递归 + 哈希
* @param s
* @return
*/
private String[] solution1(String s){
dfs(s, 0, "");
ArrayList<String> list = new ArrayList<>(set);
return list.toArray(new String[list.size()]);
}
/**
* 递归
* @param s
* @param idx
* @param sub
*/
private void dfs(String s, int idx, String sub){
set.add(sub);
if(idx == s.length()){
return;
}
// 从左往右 依次选择
for(int i=idx; i<s.length(); i++){
dfs(s, i+1, sub+s.charAt(i));
}
}
/**
* 递归 + 哈希
* @param s
* @return
*/
private String[] solution2(String s){
operate(s, 0, "");
ArrayList<String> list = new ArrayList<>(set);
return list.toArray(new String[list.size()]);
}
/**
* 递归
* @param s
* @param idx
* @param sub
*/
private void operate(String s, int idx, String sub){
set.add(sub);
if(idx == s.length()){
return;
}
// 选择
operate(s, idx+1, sub+s.charAt(idx));
// 不选
operate(s, idx+1, sub);
}
}