public class DistinctSubSeq {
//long
char[] cs;
//short
char[] ts;
public int numDistinct(String S, String T) {
cs=S.toCharArray();
ts=T.toCharArray();
int len1=cs.length-1;
int len2=ts.length-1;
int[][] l=new int[len2+1][len1+1];
for(int j=0;j<cs.length;j++){
char c=cs[len1-j];
for(int i=0;i<ts.length;i++){
char m=ts[len2-i];
if(m==c){
if(i==0&&j==0){
l[i][j]=1;
continue;
}
if(i==0){
l[i][j]=l[i][j-1]+1;
continue;
}
if(j==0)
continue;
l[i][j]=l[i-1][j-1]+l[i][j-1];
}else{
if(j==0)
continue;
l[i][j]=l[i][j-1];
}
}
}
return l[len2][len1];
}
public static void main(String[] args) {
DistinctSubSeq ds=new DistinctSubSeq();
int v=ds.numDistinct("ababcc", "abbc");
System.out.println(v);
}
}
Code Rewrite:
int tlen,slen;
String s,t;
int res=0;
int[][] dp;
public int dp(){
int[]sum=new int[tlen];
dp=new int[slen+1][tlen+1];
for(int i=0;i<slen;i++){
char c=s.charAt(i);
for(int j=tlen-1;j>=0;j--){
char c2=t.charAt(j);
if(c==c2){
if(j==0)
dp[i][j]=1;
else
dp[i][j]=sum[j-1];
sum[j]+=dp[i][j];
}
}
}
return sum[tlen-1];
}
public int numDistinct(String S, String T) {
if(T.length()>S.length())
return 0;
s=S;
t=T;
slen=s.length();
tlen=t.length();
return dp();
}