• LeetCode OJ-- Distinct Subsequences ** 递推


    https://oj.leetcode.com/problems/distinct-subsequences/

    对于string S 和 T求,T 是 S的几种子串。

    首先想到了递归方法,列出递归公式,奈何超时了:

    如果S[sBegin] == T[tBegin] 则是 numSubDistinct(sBegin+1,tBegin+1,S,T) + numSubDistinct(sBegin+1,tBegin,S,T);
    如果不等于,则 numSubDistinct(sBegin+1,tBegin,S,T);
    如果T的遍历指针到头了,则说明成功了一次匹配

    class Solution {
    public:
        int numDistinct(string S, string T) {
            int ans = 0;
            if(S.size()<T.size())
                return 0;
            if(S.size() == T.size())
                if(S == T)
                    return 1;
                else
                    return 0;
            return numSubDistinct(0,0,S,T);
        }
        int numSubDistinct(int sBegin,int tBegin,string &S,string &T)
        {
            if(tBegin== T.size())
                return 1;
            if(sBegin == S.size() && tBegin!= T.size())
                return 0;
            if(S[sBegin] == T[tBegin])
                return numSubDistinct(sBegin+1,tBegin+1,S,T) + numSubDistinct(sBegin+1,tBegin,S,T);
            else
                return numSubDistinct(sBegin+1,tBegin,S,T);
        }
    };

    之后,考虑用递推实现。

    根据思路来说,首先想到从后往前递推,但如果从后往前可以,则从前往后也可以。

    建立二维数组num[S.size()][T.size()]存这个过程中产生的中间结果。

    首先定义:num[i][j]是对于S从0到 i 的子串,对于T从 0 到 j 的子串,这两个字符串,T是S的子串数。

    如果S[sBegin] == T[tBegin] num[sBegin][tBegin] = num[sBegin-1][tBegin-1] + num[sBegin-1][tBegin];

    如果不等于则 num[sBegin][tBegin] = num[sBegin-1][tBegin];

    根据公式,考虑到进行两层循环,
    但是循环之前需要初始化

    class Solution {
    public:
        int numDistinct(string S, string T) {
            int ans = 0;
            if(S.size()<T.size())
                return 0;
            if(S.size() == T.size())
                if(S == T)
                    return 1;
                else
                    return 0;
    
            vector<vector<int> > num;
            num.resize(S.size());
            for(int i = 0;i<S.size();i++)
                num[i].resize(T.size());
    
            //initialize
            if(S[0] == T[0])
                num[0][0] = 1;
            else
                num[0][0] = 0;
            for(int i = 1;i<S.size();i++)
            {
                if(S[i] == T[0])
                    num[i][0] = num[i-1][0] + 1;
                else
                    num[i][0] = num[i-1][0];
            }
    
            for(int j = 1;j<T.size();j++)
            {
                num[0][j] = 0;
            }
    
            for(int sBegin = 1;sBegin<S.size();sBegin++)
                for(int tBegin = 1;tBegin<T.size();tBegin++)
                {
                    if(S[sBegin] == T[tBegin])
                        num[sBegin][tBegin] = num[sBegin-1][tBegin-1] + num[sBegin-1][tBegin];
                    else
                        num[sBegin][tBegin] = num[sBegin-1][tBegin];
                }
            
            return num[S.size()-1][T.size()-1];
        }
    };
  • 相关阅读:
    Redhat7.x静默安装19C客户端
    利用增量备份修复DG备库中的gap>>>>>>>>>>>有新增数据文件
    利用增量备份修复DG备库中的gap>>>>>>>>>>>无新增数据文件
    ORA-01665 control file is not a standby control file
    ORA-01110 ORA-01122 ORA-01110 ORA-01200解决办法
    Zabbix5.0+Grafana可视化部署教程
    RedHat 7.5配置bonding双网卡绑定(转)
    11.2.0.1 RAC环境部分磁盘组无法自动挂载,导致数据库实例无法启动(转)
    11.2.0.1 RAC环境经典bug CRS-4124: Oracle High Availability Services startup failed.
    Git配置SSH及常用命令
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3817175.html
Copyright © 2020-2023  润新知