题解 | #编号子回文I#

174 阅读2分钟

描述

在一个农场中,有一群牛,每头牛都有一个独特的编号,编号由数字和字母组成。农场主人想要找出这些牛中编号最长的回文串。回文串是指正读反读都一样的串。

示例1

输入:"mooomn"
返回值:"mooom"

示例2

输入:"abcbde"
返回值:"bcb"

知识点

动态规划

解题思路

使用一个二维数组dp来保存状态转移矩阵,其中dp[i][j]表示从索引i到j的子串是否是回文串。

首先,我们初始化状态,将单个字符视为回文串,即dp[i][j]=true。

然后,我们使用两个嵌套循环遍历所有的子串,根据首尾字符是否相同,并且中间部分是否回文串来判断整个子串是否为回文串。如果是回文串,则更新最长回文串的长度和起始位置。

最终,我们通过substring方法返回最长回文串的子串。

Java题解

import java.util.*;


public class Solution {
    
    public String longestPalindrome (String s) {
        int n = s.length();
        boolean[][] dp = new boolean[n][n];
        for (int i = 0; i < n; i++) {
            dp[i][i] = true;
        }

        int maxLength = 1;
        int start = 0;

        for (int j = 1; j < n; j++) {
            for (int i = 0; i < j; i++) {
                if (s.charAt(i) == s.charAt(j) && (j - i <= 2 || dp[i + 1][j - 1])) {
                    dp[i][j] = true;
                    if (j - i + 1 > maxLength) {
                        maxLength = j - i + 1;
                        start = i;
                    }
                }
            }
        }

        return s.substring(start, start + maxLength);
    }
}

总结

时间复杂度:

  • 使用两层循环遍历字符串所有可能的子串,时间复杂度为O(n^2)。
  • 在每个子串的比对过程中,需要常数时间来比较字符,时间复杂度为O(1)。 因此,算法的总体时间复杂度为O(n^2)。 空间复杂度:
  • 需要一个二维数组dp来保存每个子串是否是回文串的状态,空间复杂度为O(n^2)。
  • 需要常数空间来保存最长回文串的长度和起始位置,空间复杂度为O(1)。 所以,算法的总体空间复杂度为O(n^2)。

遇到这个字符字串的问题,我们首先要考虑的就是动态规划 1.创建一个二维数组来存储状态转移矩阵 2.记录最长回文串的长度 3.记录最长回文串的起始位置 4.如果首尾字符相同,并且中间部分是回文串,则整个字符串是回文串 5.更新最长回文串的长度和起始位置 解决这几个问题便是解决回文子串的关键。