求一个字符串内最大的回文字符串的长度

本文介绍了一种通过双循环嵌套的方式寻找给定字符串中最长回文子串的方法。该算法首先检查奇数长度的回文情况,接着检查偶数长度的回文情况,并在过程中不断更新最长回文子串的长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【思路】

如果一段字符串是回文,那么以某个字符为中心的前缀和后缀都是相同的,例如,以“aba”为例,以b为中心,他的前缀和后缀都是相同的a。

这样,我们就从字符串第一个字符开始,然后看它的左边和右边是否相等,当然啦,第一个字符,回文数就是1。

然后第二个字符作为中心,它的左边,第一个字符,它的右边,第三个字符,看这两个字符是否相等,若相等,回文长度就为3=2*1+1了,很好。继续,再往左没字符了,退出当前循环。

紧接着中心字符变成第三个字符,再来看看以第三个字符为中心是不是回文的,如果是,则更新回文长度。

看到这里,我想大家应该想到这是用的两个循环嵌套的,第一个循环用来从头到尾遍历字符串,把每个字符串作为中心元素,然后嵌套循环里看以他为中心是否是回文。

点评:1考察回文判断;2循环问题;3动态规划

【代码】

    // 求一个字符串内最大的回文字符串的长度
    public static int getMaxLen(String str) {
        if (str == null || str.equals("")) {
            return 0;
        }
        char[] charArr = str.toCharArray();
        int max = 0;
        int len = 0;
        for (int i = 0; i < str.length(); i++) {
             // i看成是中心元素,然后i-j是左边,i+j是右边元素,比较这两个元素是否相等  
            for (int j = 0; i - j >= 0 && i + j < str.length(); j++) {
                if (charArr[i + j] != charArr[i - j]) {// 比较左右对称的元素是否相等,此时i固定,j在增加
                    break; // 直到不相等,回文结束,此时回文长度为2*j+1
                }
                len = 2 * j + 1;
            }
            max = max > len ? max : len;  // 如果len的值大于最大记录的回文长度,更新最大记录
             // 同理在偶数长度时,回文长度为2*j+2  
            for (int j = 0; i - j >= 0 && i + j + 1 < str.length(); j++) {
                if (charArr[i + j + 1] != charArr[i - j]) {
                    break;
                }
                len = 2 * j + 2;
            }
            max = max > len ? max : len;
        }
        return max;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值