【问题标题】:Count distinct occurrences as a subsequence将不同的出现计数为子序列
【发布时间】:2019-02-06 23:49:00
【问题描述】:

我正在阅读来自 geeksforgeeks 的“将不同的事件计数为子序列问题”。我想了解“其他”的情况。在最后一个字符匹配的情况下,为什么S+没有最后一个字符的结果没有S和T的最后两个字符?

Input  : S = banana, T = ban
Output : 3
T appears in S as below three subsequences.
[ban], [ba  n], [b   an]

// Returns count of subsequences of S that match T 
// m is length of T and n is length of S
subsequenceCount(S, T, n, m)

// 一个空字符串是所有的子序列。 1) 如果 T 的长度为 0,则返回 1。

// 否则没有字符串可以是空 S 的序列。 2) 否则,如果 S 为空,则返回 0。

3) 否则,如果 S 和 T 的最后一个字符不匹配, 删除 S 的最后一个字符并重复剩余 return subsequenceCount(S, T, n-1, m)

4) Else(最后一个字符匹配),结果为 sum 两个计数。

    // Remove last character of S and recur.
    a) subsequenceCount(S, T, n-1, m) + 

    // Remove last characters of S and T, and recur.
    b) subsequenceCount(S, T, n-1, m-1)  

【问题讨论】:

    标签: algorithm data-structures dynamic-programming


    【解决方案1】:

    考虑S="banan"T="ban" 的情况。最后一个字符匹配,因此S 的子序列中出现的任何T 必须:

    • 不包括S 的最后一个字符。这简化为子问题S="bana"T="ban",出现1次:“bana”。
    • 包括S 的最后一个字符。这简化为子问题S="bana"T="ba"。这里有 2 次出现:“bana”和“bana”。如果我们回到主要问题,对应的出现是 "banan" 和 "banan”。

    出现的总次数是两个子问题的总和。

    【讨论】:

      【解决方案2】:

      这可能是一个更简单的解决方案 S = "香蕉" T =“禁止”

      int solve(int i, int j, string &S, string &T){
       if(j>=T.size())
          return 1;
       else if(i>=A.size() && j<T.size())
          return 0;
       int sum = 0;
      
       sum = solve(i+1, j, S, T);
      
       if(S[i] == T[j]){
         sum += solve(i+1, j+1, S, T);
       }
       return sum;
      }
      

      在此方案中,i 表示 S 字符串的索引,j 表示 T 字符串的索引。在(i, j) 的任何状态下,我们都有两种可能的情况,两个字符串的给定索引处表示的字符匹配或不匹配。

      1. 如果字符匹配或不匹配,我们必须移动到 S 字符串的下一个字符,因为字符串 T 可以在 S 的下一个子部分中找到。
      2. 如果字符匹配,则移至每个字符串的下一个字符。
      3. 最后,取两个可能的递归关系之和并返回。

      【讨论】:

      • 你能在这个递归代码中添加记忆解决方案吗?
      猜你喜欢
      • 2020-08-19
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多