Distinct Subsequences 哥们总算自己写个自底向上的dp解

来源:互联网 发布:手机天文软件 编辑:程序博客网 时间:2024/06/06 02:27
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();    }


0 0