题解后补。
题目
解题
伪代码描述(推荐)
分析及源码
Java解法一
暴力求解,列举所有的子串,判断是否为回文串,保存最长的回文串。
1 | class Solution { |
时间复杂度: O(n³)。
空间复杂度:O(1),常数个变量。
暴力解法通过案例数101/103
Java解法二
把原来的字符串倒置了,然后找最长的公共子串。
求最长公共子串(不是公共子序列),有很多方法,这里用动态规划的方法,
整体思想就是,申请一个二维的数组初始化为 0,然后判断对应的字符是否相等,相等的话
1 | arr [ i ][ j ] = arr [ i - 1 ][ j - 1] + 1 |
当 i = 0 或者 j = 0 的时候单独分析,字符相等的话
1 | arr [ i ][ j ] = 1 |
$$
arr[i][j]
$$
保存的就是公共子串的长度。
当原始字符串S 的其他部分中存在非回文子串的反向副本时,最长公共子串法就会失败。
当找到最长的公共子串的候选项时,都需要检查子串的索引是否与反向子串的原始索引相同。如果相同,那么我们尝试更新目前为止找到的最长回文子串;如果不是,我们就跳过这个候选项并继续寻找下一个候选。
1 | class Solution { |
时间复杂度:两层循环,O(n²)。
空间复杂度:一个二维数组,O(n²)。
本文作者:
Yao Zhu
发布时间: 2019-12-17
最后更新: 2019-12-21
本文链接: https://juoyo.github.io/posts/7e6bdb80.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
发布时间: 2019-12-17
最后更新: 2019-12-21
本文链接: https://juoyo.github.io/posts/7e6bdb80.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!