字符串的全部子序列和不重复的子序列
字符串的全部子序列
题目描述:
示例: String str = “abs”;
字序列是: “” , s , b , bs, a
as
ab
abs
空字符串也是字序列
解题思路
全部子序列就是把abs 这个字符串全部拆成单个char字符,每个位置都有可能选,有可能不选。
因此递归就有了,这个位置上的字符选和不选两种情况,都要递归。
代码演示
/**
* 所有子序列
* @param str
* @return
*/
public static List<String> subStrSeq(String str){
if (str == null || str.equals("")){
return null;
}
char[] chars = str.toCharArray();
//存储答案
ArrayList<String> ans = new ArrayList<>();
process(chars,0,ans,"");
return ans;
}
/**
*
* @param str 字符数组
* @param index 下标位置
* @param ans 保存答案
* @param path 已经选择过的结果
*/
public static void process(char[]str, int index, List<String> ans,String path){
//base case
if (index == str.length){
ans.add(path);
return ;
}
//path z作为上一步的选择结果,来到当前位置,当前位置的字符也是有选和不选两种情况。
//不选的情况
process(str,index + 1,ans,path);
//选择当前字符的情况。
process(str,index + 1,ans,path+String.valueOf(str[index]));
}
打印一个字符串的全部子序列,要求不要出现重复字面值的子序列
解题思路:
过程和上面一样,只需要把返回的结果用HashSet 去重一下就行了,直接看代码吧,不解释了
/**
* 所有子序列 去除重复字面值的子序列
* @param str
* @return
*/
public static HashSet<String> subStrSeq1(String str){
if (str == null || str.equals("")){
return null;
}
char[] chars = str.toCharArray();
//存储答案
HashSet<String> ans = new HashSet<>();
process1(chars,0,ans,"");
return ans;
}
/**
*
* @param str 字符数组
* @param index 下标位置
* @param ans 保存答案
* @param path 已经选择过的结果
*/
public static void process1(char[]str, int index, HashSet<String> ans,String path){
//base case
if (index == str.length){
ans.add(path);
return ;
}
//path z作为上一步的选择结果,来到当前位置,当前位置的字符也是有选和不选两种情况。
//不选的情况
process1(str,index + 1,ans,path);
//选择当前字符的情况。
process1(str,index + 1,ans,path+String.valueOf(str[index]));
}

文章介绍了如何使用Java编程解决字符串的全部子序列问题,包括如何避免生成重复的子序列。通过递归方法,分别展示了无重复子序列的生成过程,并提供了具体的代码实现。
4909

被折叠的 条评论
为什么被折叠?



