第49天|LeetCode647. 回文子串、LeetCode516. 最长回文子序列

1.题目链接:647. 回文子串

题目描述:

                给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。

                回文字符串 是正着读和倒过来读一样的字符串。

                子字符串 是字符串中的由连续字符组成的一个序列。

                具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

解法:

                ①此题要求回文子串的数目,那么我们就要知道如何判断是回文子串

                ②当两端元素相同的时候,有三种情况:

                                        情况1:i j指向同一个位置,即j-i = 0,此时是回文串

                                        情况2:i j相邻,即 j - i = 1,此时是回文串

                                        情况3:i j不相邻,即j - i  > 1,此时要想使得从i到j是回文串的话,就要保证i+1到j-1是回文串

                                        其他情况都不是回文串了。

                ③分析完确定dp数组的含义,dp[i][j]表示下标从i到j的字符串是不是回文串。是---dp[i][j] = true;不是dp[i][j] = false,且j >= i

                ④递推公式:

                                if(ch[i] == ch[j]){如果j-i <= 1 --- dp[i][j] = true;result++.否则的话,如果dp[i+1][j-1] == true,dp[i][j] = true,result++}

                ⑤初始化:不能初始化为true,所以只能初始化为false。

                ⑥遍历顺序:根据i+1和j-1,说明是左下方推导来的,所以要从左至右从下到上

                ⑦最后返回result。

下面为代码(java):

第49天|LeetCode647. 回文子串、LeetCode516. 最长回文子序列_第1张图片

第49天|LeetCode647. 回文子串、LeetCode516. 最长回文子序列_第2张图片 

2.题目链接:516. 最长回文子序列 

题目描述:

                给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。

                子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

解法:

                ①此题和上一题的不同就是这个不要求连续,而上一题要求连续,但同样是求回文子串问题,从两端考虑。

                ②这题要求长度,那么dp[i][j]的含义就是从下标i到下标j的字符串的最长回文子序列的长度为dp[i][j]

                ③递推公式:

                                dp[i][j] = ? 当ch[i] == ch[j],dp[i][j] = dp[i+1][j-1] + 2。如果不等,那么dp[i][j] = max(两个元素中任选一个)即max(dp[i][j-1], dp[i+1][j])。

                ④初始化:从递推公式中可以看出,dp[i][j]的值是通过ij不断向内收缩得到的,所以我们要初始化i和j相等的时候即dp[i][i] = 1.其余位置因为长度从0开始计算,所以赋成0。

                ⑤遍历顺序:根据递推公式,是从左和下方得到的,所以要从左向右,从下到上遍历。

                ⑥在写循环的时候j = i+1开始,因为初始化的时候我们已经初始化了dp[i][i]所以不需要再去计算ij相等的时候的值了。

                ⑦最后返回dp[0][ch.length-1]。

下面为代码(java):

第49天|LeetCode647. 回文子串、LeetCode516. 最长回文子序列_第3张图片

 第49天|LeetCode647. 回文子串、LeetCode516. 最长回文子序列_第4张图片

3.总结:

                ①第一题求的是回文子串,是连续的。

                ②第二题求的是回文子序列,是不连续的。

                ③两题相同的就是都用到了判断回文串的方法,即从两端着手判断。 

你可能感兴趣的:(算法,数据结构,动态规划,leetcode,java)