标签:index return 不同 115 chs str ans 序列 path
获取字符串的所有子序列
子序列:字符的相对位置不变,但可以选要与不要
打印所有子序列:从左往右依次的尝试模型
从第一个字符开始做决定,选择要与不要
eg:
a b c
0 1 2
0: 要a,不要a
1:要b ,不要b
2:要c ,不要c
"",a,ab,ac,abc,b,bc,c
暴力递归:
public List<String> allSubSeq(String str){ List<String> ans=new ArrayList<>(); if(str==null){ return ans; } if(str.length()==0){ ans.add(""); return ans; } char[] chs=str.toCharArray(); process(chs,0,"",ans); return ans; } /** ans: 收集的结果集 path:记录沿途的路径 str[0....index-1]的沿途决定,是path记录的 str[index...]的每一个字符,都可以选择要与不要 所以的子序列,都放入到ans里去 */ private void process(char[] str,int index,String path,List<String> ans){ if(index==str.length){ ans.add(path); return; } //不要当前字符 process(str,index+1,path,ans); //要当前字符 process(str,index+1,path+str[index],ans); }
115. 不同的子序列
给定一个字符串 s
和一个字符串 t
,计算在 s
的子序列中 t
出现的个数。
字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。
(例如,"ACE"
是 "ABCDE"
的一个子序列,而 "AEC"
不是)
题目数据保证答案符合 32 位带符号整数范围。
暴力递归的方式在leetcode会超出空间限制,这里先给出暴力递归的代码,后面优化成动态规划或缓存优化
class Solution { public int numDistinct(String s, String t) { List<String> ans= getAllSubseq(s); int index=0; for(String str:ans){ if(str.equals(t)){ index++; } } return index; } public List<String> getAllSubseq(String str){ List<String> ans=new ArrayList<>(); if(str==null){ return ans; } if(str.length()==0){ ans.add(""); return ans; } char[] chs=str.toCharArray(); process(chs,0,"",ans); return ans; } public void process(char[] chs,int index,String path,List<String> ans){ //base case if(index==chs.length){ ans.add(path); return; } process(chs,index+1,path,ans); process(chs,index+1,path+chs[index],ans); } }
标签:index,return,不同,115,chs,str,ans,序列,path 来源: https://www.cnblogs.com/iwyc/p/15226445.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。