最长的Palindrome子序列循环

时间:2014-09-05 13:19:01

标签: java dynamic-programming palindrome

我正在阅读有关Longest Palindrome Subsequence算法的信息并且看到了这个视频: - 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<n-gap中,为什么他这样做?

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

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

由于

1 个答案:

答案 0 :(得分:1)

  1. 您有一个nxn矩阵,用于存储子问题的结果。他正在问题1上面的块中标记这个矩阵的诊断。这个块表示每个字符都是大小为1的回文。将gap = 1设置为start意味着他不会重新测试单个字符,而是开始寻找在子串长度== 2
  2. 您需要通过输入字符串向上移动字符串的左侧索引,直到其位置加上您测试的长度的子字符串仍然在字符索引的有效范围内。这是为了防止边界索引例外
  3. 他正在挑选他将要测试palindrome-ness的子串的右边界