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;//复杂度计数测试
}
/**
* 给定两个字符串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;//复杂度计数测试
}