【刷题记录1】最长回文子串

文章详细阐述了在给定字符串中寻找最长回文子串的两种方法,重点讲解了利用动态规划优化时间复杂度的过程。
摘要由CSDN通过智能技术生成

题目:最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。

输入:一个字符串 s。你可以假设 s 的最大长度为 1000。

输出:s 中最长的回文子串。

示例:

输入: “babad”

输出: “bab”

注意: “aba” 也是一个有效答案。

输入: “cbbd”

输出: “bb”

这道题笔者有两种解法,第一种是暴力求解,使用双重循环,对每个i、j对象构成的子串进行回文的判断,较为简单,但是时间复杂度较高,不是面试的最优解:

 public static void main(String[] args) {
        int maxLength = 0;
        String res = "";
        String str = "ABCCBERBA";
        for(int i=0; i< str.length() - 1; i++){
            for(int j= i+1; j< str.length() ; j++){
                if(isValidHuiWen(str,i,j)){
                    if (j -i +1 > maxLength){
                        maxLength = j - i + 1;
                        res = str.substring(i,j+1);
                    }
                }
            }
        }
        System.out.println(res);
    }

第二种应该使用动态规划,我们找到递推公式的过程比较绕,可以从短到长的去扩展这个字符串,判断dp[i][j]可以根据dp[i+1][j-1]进行递推,i 从后到前做减法,j从前到后做加法,这个过程中有几个情况:

  • i和j相等,下标指向同一个字符,一定是回文 dp[i][j] = true
  • i和j不等,差值为1,只要str.charAt(i)== str.charAt(j),就说明是回文,此时dp[i][j] = true
  • i和j不等,差值大于1,那么在判断str.charAt(i)== str.charAt(j)的基础上,还需要dp[i+1] [j-1] = true,才能保证是回文
    因此可以给出下述代码:
public class LongestHuiwenTestSelf {
    public static void main(String[] args) {
        String s = "cafqabbaqgwesgh";
        String res = longestHuiwen(s);
        System.out.println(res);
    }

    public static String longestHuiwen(String str) {
        boolean[][] dp = new boolean[str.length()][str.length()];
        if (str.length() == 1) {
            return str;
        }
        String res = "";
        for (int i = str.length() - 1; i > 0; i--) {
            for (int j = i; j < str.length(); j++) {
                if (i == j) {
                    dp[i][j] = true;
                }
                //如果j和i相等,或者
                if (str.charAt(j) == str.charAt(i)) {
                    if(j - i ==0 || j-i ==1){
                        dp[i][j] = true;
                    } else if (dp[i + 1][j - 1]) {
                        dp[i][j] = true;
                    }
                }

                if (dp[i][j] && (j - i + 1) > res.length()) {
                    res = str.substring(i, j + 1);
                }
            }
        }
        return res;
    }
}

经过测试,输出结果: qabbaq,说明是回文,判断成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值