【问题标题】:Dynamic Programming to find all palindromic substrings动态规划查找所有回文子串
【发布时间】:2017-02-06 09:02:42
【问题描述】:

我试图通过动态编程解决一个问题。我有一个字符串,我需要找到所有可能的回文子字符串。说,我有一个长度为n 的字符串。我为查找创建了一个矩阵n*n。单元格(i,j) 为 1 或 0。如果为 1,则表示 substring[i..j] 是回文,否则为 0。最初对角线为 1,因为每个字符本身都是回文。

我需要如上所述正确填充矩阵。

我想出了以下几点:

  1. 如果 substring[i..j] 是一个plaindrome,那么我可以通过检查 matrix[i][j]== 来找到 substring[i-1..j+1] 在O(1) time 是否是回文1 和 word[i-1] == word[j+1]..

对于其他一般情况,我该如何填充矩阵。

将不胜感激使用伪代码/语言特定实现来填写矩阵的小解释

编辑:我需要一些关于矩阵如何以及以何种顺序填充(即对角线、水平线等)的解释。我只想通过填写这个矩阵来解决这个问题,而不是通过其他方法。我的问题不是 this 的重复

【问题讨论】:

  • 如果您将 substring 定义为 substring(start, end) 而不是 substring(start, length) 那么矩阵的一半将为零,因为它是无效值(end
  • @samgak:我知道!!!矩阵的对角线右上半部分将始终为 0
  • 您还需要检查所有长度为 2 的子字符串,然后您可以使用您的规则生成其余部分。

标签: algorithm matrix dynamic-programming


【解决方案1】:

可以检查长度为1到N的回文子串。

  For i from 1 to n
       Mark all substring of length i is palindromic or not.

伪代码:(基于字符串数组1)

for len=1 to n:  // check string from length 1 to n
    for i=1 to (n-len + 1):  // substring start from 1 to (n-len+1)
        j = i + len - 1
        if len == 1:
           matrix[i][j]==1 
        else if len == 2:
           if array[i] == array[j]:
               matrix[i][j] = 1
           else:
               matrix[i][j] = 0
        else:
           if matrix[i+1][j-1] == 1 and array[i] == array[j]:
               matrix[i][j] = 1
           else:
               matrix[i][j] = 0

【讨论】:

  • 你能解释一下“Mark length i strings as palindromic or not”这行吗??
  • @User_Targaryen 对不起。必须是,标记长度为 i 的子串是否为回文。我会编辑它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 2016-12-26
相关资源
最近更新 更多