【所有子序列问题】

public class AllSubSequence {
/** 
* 给定两个字符串s和t(len(s)>len(t)),t可能是s的一个子序列。求所有s的子序列集合中,有多少个子序列等于t。
* 例如s="abbbc",t="abc",结果为3,即在s的所有子序列集合中,有3个子序列为t。
* 关注微信公众账号“待字闺中”,了解更多。
*/
public static void main(String[] args) {
AllSubSequence all=new AllSubSequence();
if(all.c==null || all.c.length<=0)all.c=new int[all.a.length()][all.b.length()];
System.out.println("最终匹配的子串个数:"+all.f(all.a.length()-1, all.b.length()-1));//打印原问题的最终结果
System.out.println("遍历计数:"+all.count);//O(i*k)多项式复杂度测试
}
/*
 * f: 求a[0...i]中包含多少个b[0...k]子序列
 * */
public int f(int i,int k){
count++;
if(c[i][k]>0)return c[i][k];

if(i<k)return 0;  
if(a.charAt(i)!=b.charAt(k))return f(i-1,k);
if(k==0){
//返回字符b[0]在串a[0...i]中的数量
return a.substring(0, i+1).length()-a.substring(0, i+1).replace(String.valueOf(b.charAt(0)),"").length();

}
c[i][k]=  f(i-1,k-1)+f(i-1,k); //核心步骤,将指数级的递归复杂度,降到了n^2的多项式复杂度
return c[i][k];


String a="aaabbbbbababababababbbbbbbbaaabbbbbbbaabbbbbbbaaaabababababbababababababaa"; //任意指定的待匹配串
String b="abaaa";//任意指定的匹配串
int [][] c;//保存中间结果
int count=0;//复杂度计数测试
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值