找出字符串的全部子序列
字符串的子序列是通过在保持顺序的同时从字符串中删除零个或多个字符来获得的。给定一个字符串,生成一个所有子序列按字母顺序升序排列的数组,忽略空字符串。
例子
s = " xyz "
不包括空字符串,排序子序列是{‘x’,‘xy’,‘xyz’,‘xz’,‘y’,‘yz’,‘z’}。
返回
Str[]:字符串数组,由给定字符串的所有子序列组成,按字母顺序升序排列。
约束
1.1<长度s<16
2.s是一个不同的小写英文字母ascii[a-z]
题目解析:给出一个任意的字符串,首先要把字符串要变成按顺序排列的字符串,可以先变成字符串List集合,用stream流的sort方法来对List进行排序,然后再拼接成一个有顺序的字符串,字符串的子序列是通过在保持顺序的同时从字符串中删除零个或多个字符来获得的,证明每一个元素都有可能需要,或者不要地进行组合。元素本身分情况的进行组合可以利用递归的方法。代码如下:
//寻找字符串所有子序列(递归)
public class test {
public static void main(String[] args) {
String test = "xyz";
//转换成一个有序无空字符串的字符串
String target =afterChange(test);
List<String> ans1 = subList(target);
//如果打印非重复子序列,可用数据结构
// HashSet<String> ans1 = new HashSet<>();
for(String ans : ans1){
if(!" ".equals ( ans )){
System.out.println(ans);
}
}
System.out.println("=========");
}
private static String afterChange(String target) {
//转换成字符数组
char[] str = target.toCharArray();
HashSet<String> targetStr = new HashSet<>();
//去空字符串
for (char c:str){
String a =String.valueOf (c);
if (!" ".equals (a)){
targetStr.add ( a );
}
}
//排序拼接成有序的字符串
List<String> stringList = targetStr.stream()
.sorted()
.collect( Collectors.toList());
String a= "";
for (String c:stringList){
a=a+c;
}
return a;
}
private static List<String> subList(String test) {
//转换成字符数组
char[] str = test.toCharArray();
String path = " ";
List<String> ans = new ArrayList<>();
process(str,0,ans,path);
return ans;
}
private static void process(char[] str, int index, List<String> ans, String path) {
if(index == str.length){
// 把所有生成的子序列,放入到ans里去
ans.add(path);
return;
}
// 没有要index + 1位置的字符
process(str,index + 1,ans,path);
// 要了index + 1位置的字符
process(str,index + 1,ans,path + str[index]);
}
}