【问题标题】:I want to use optimise my recursive solution using memoisation for Distinct Subsequences problem我想使用记忆来优化我的递归解决方案来解决不同的子序列问题
【发布时间】:2021-01-16 09:54:08
【问题描述】:

问题陈述是: 给定两个序列 A 和 B,计算序列 A 中唯一路的数量,以形成与序列 B 相同的子序列。 子序列:字符串的子序列是由原始字符串通过删除一些(可以是无)字符而不干扰剩余字符的相对位置而形成的新字符串。 (即,“ACE”是“ABCDE”的子序列,而“AEC”不是)。

目标: 我想使用 dp 优化我的递归解决方案

我的方法: 我正在尝试制作给定字符串的所有可能子序列,如果子序列与模式 ans 匹配,则为 ans=ans+1。

我想记住解决方案并使用 dp 来优化时间复杂度,但想不出该怎么做。

代码:

int funct(string &given,string &target,string &curr, int index)
{
    if(curr == target)
    {
        return 1;
    }
    if( index >= given.size() )
    return 0;
    int without = funct(given,target,curr,index+1);
    curr.push_back(given[index]);
    int with = funct(given,target,curr,index+1);
    curr.pop_back();
    return with+without;
}
int Solution::numDistinct(string A, string B) 
{
    string s;
    return funct(A,B,s,0);
}

【问题讨论】:

    标签: recursion dynamic-programming


    【解决方案1】:
    • 设 A 的长度为 L1,B 的长度为 L2。
    • 让 f(i,j) 成为一个函数,它为您提供从序列 A(i...L1-1) 中获取序列 B(j...L2-1) 的多种方法,然后您的问题的答案将是 f(0,0)。
    • 请注意,序列 A(i...L1-1) 表示子串 A(i...L1-1),B(j...L2-1) 表示子串 B(j. ..L2-1).

    这是用 C++ 编写的代码:

    int memo[100][100];
    string A, B;
    
    int f(int i, int j) {
        if (i >= A.length() || j >= B.length()) return 0;
        if (A[i] == B[j]) {
            if (j == B.length() - 1)
                memo[i][j] = 1 + f(i + 1 , j);
            else
                memo[i][j] = f(i + 1, j + 1) + f(i + 1, j);
        }
        else {
            memo[i][j] = f(i + 1, j);
        }
        return memo[i][j];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      • 2018-10-07
      • 2021-06-23
      • 2022-01-19
      • 2021-02-17
      • 2021-06-22
      • 2020-09-26
      相关资源
      最近更新 更多