【问题标题】:Longest Palindrome Subsequence Looping最长回文子序列循环
【发布时间】:2014-09-05 13:19:00
【问题描述】:

我正在阅读有关最长回文子序列算法的内容并看到了这个视频:- Video

还偶然发现了这个问题的动态程序代码博客。 Ajeet Singh

这是来自上述链接的代码:-

public static int getLongestPalindromicSubSequenceSize(String source){
    int n = source.length();
    int[][] LP = new int[n][n];

    //All sub strings with single character will be a plindrome of size 1
    for(int i=0; i < n; i++){
        LP[i][i] = 1;
    }
    //Here gap represents gap between i and j.
    for(int gap=1;gap<n;gap++){   //-------> 1
        for(int i=0;i<n-gap;i++ ){// --------> 2
                    int j=i+gap; // ---------> 3
                    if(source.charAt(i)==source.charAt(j) && gap==1)
                        LP[i][j]=2;
                    else if(source.charAt(i)==source.charAt(j))
                        LP[i][j]=LP[i+1][j-1]+2;
                    else
                        LP[i][j]= Math.max(LP[i][j-1], LP[i+1][j]);              
         }      
    }       
    return LP[0][n-1];      
}

在上面的代码中,我将三行标记为 1、2 和 3。 我无法理解那些循环。 我的疑惑:-

1)在第一个循环中,他将一个名为 gap 的整数初始化为 1 。 为什么他把它初始化为 1 而不是 0 呢?

2) 在第二个 for 循环中,i&lt;n-gap,他为什么这样做?

3) int j=i+gap 为什么又这样?

我是 Java 新手,在理解它们时遇到了问题。请任何人解释这三行代码。

谢谢

【问题讨论】:

    标签: java dynamic-programming palindrome


    【解决方案1】:
    1. 您有一个 nxn 矩阵来存储子问题的结果。他在问题 1 上方的块中标记了该矩阵的诊断。该块表示每个字符都是大小为 1 的回文。将 gap = 1 设置为开始意味着他不会重新测试单个字符,而是开始查找在长度 == 2 的子字符串处
    2. 您需要将字符串的左索引向上移动到输入字符串,直到其位置加上您正在测试的子字符串的长度仍在字符索引的有效范围内。这是为了防止索引边界异常
    3. 他正在选择要测试回文性的子字符串的右边界

    【讨论】:

    • 不明白第二个答案。你能用简单的话来表达吗
    • 对于给定的字符串,比如说"0123456789",你想测试一些内部范围,比如“012”或“567”。对于这 2 个示例,它们的间隙长度为 2:2 -0 = 27 - 5 = 2... 如果您没有使用 i &lt; n - gap,那么您可以得到一个 IndexOutOfBoundsException,因为 j 可以指向“超过 9 点”。 . 即,如果j 曾经指向其中一个 x,您将尝试测试子字符串“56789xxx..”,您有错误
    猜你喜欢
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2012-09-07
    • 2012-08-29
    • 2019-06-18
    • 2022-07-21
    • 2016-04-06
    相关资源
    最近更新 更多