龙空技术网

「Leetcode简洁笔记无废话」第5题:最长回文子串

可爱小男孩76 64

前言:

目前咱们对“manacher算法时间复杂度”大致比较着重,朋友们都想要剖析一些“manacher算法时间复杂度”的相关文章。那么小编也在网上搜集了一些关于“manacher算法时间复杂度””的相关文章,希望各位老铁们能喜欢,兄弟们快快来学习一下吧!

【方法1】动态规划【时间复杂度 O(n^2) 空间复杂度 O(n^2)】

发现规律:某事物符合某一条件且该事物的子集也符合这一条件时,可以考虑dp,即动态规划

对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,它仍然是个回文串。

状态转移方程:只有 s[i+1:j-1] 是回文串,并且第 i 和 j 个字母相同时,s[i:j] 才会是回文串。

代码思路:外循环当前寻找回文串的长度,表示为 l +1。l 初始化为0是因为可能就没有回文串

这个方法还是很好理解的

class Solution {    public String longestPalindrome(String s) {        int n = s.length();        boolean[][] dp = new boolean[n][n];        String ans = "";        for (int l = 0; l < n; ++l) {            for (int i = 0; i + l < n; ++i) {                int j = i + l;                if (l == 0) {                    dp[i][j] = true;                } else if (l == 1) {                    dp[i][j] = (s.charAt(i) == s.charAt(j));                } else {                    dp[i][j] = (s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1]);                }                if (dp[i][j] && l + 1 > ans.length()) {                    ans = s.substring(i, i + l + 1);                }            }        }        return ans;    }}

【方法2】中心扩展【时间复杂度 O(n^2) 空间复杂度 O(n^2)】

与动态规划相反,这个方法是从里到外判断两侧字母是否相等

循环主串的每一个位置,以当前位置为中心进行扩展(注意回文串长度会有单双的情况),然后选取最长回文串

【方法3】Manacher 算法【时间复杂度 O(n) 空间复杂度 O(n)】

十分复杂,直接告辞

标签: #manacher算法时间复杂度 #manacher算法时间复杂度证明