题解 | #最长回文子串#

最长回文子串

http://www.nowcoder.com/practice/12e081cd10ee4794a2bd70c7d68f5507

题解

此题可以使用中心扩散法进行解答。

解题思路:

遍历整个字符串,每个字符都有两种可能:1.以当前下标为中心进行查找回文长度。2.以当前下标和下个值之间的空格为中心进行扩散。

例如:下边 i = 2时,会右如下的两种情况。

1.以 i 为中心扩散。

alt

2.以i,i+1中的空格为中心。 alt

代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String str = sc.next();
            int count = 1; // 最大回文长度,一个字符也表示回文,长度为1
            for (int i = 0; i < str.length(); i++) {
                // 情况一:以i为中心,进行两边扩散
                count = Math.max(count, cal(str, count, i - 1, i + 1));
                // 情况二:以i,i+1中间空格为中心,进行两边扩散
                count = Math.max(count, cal(str, count, i, i + 1));
            }
            System.out.println(count);
        }
    }

    // 计算当前下标下左右回文长度
    public static int cal(String str, int count, int left, int right) {
        while (left >= 0 && right < str.length() &&
                str.charAt(left) == str.charAt(right)) {
            int len = right - left + 1;
            if (len > count) {
                count = len;
            }
            left--;
            right++;
        }
        return count;
    }
}
全部评论
应该不需要做max的判断吧,因为方法里面已经根据len值对count进行了更新,最大的count值总会保留并返回,小的count会被更新
点赞 回复 分享
发布于 2023-05-23 16:47 浙江
是的,而且if (len > count)也不需要吧,len=right-left+1,一定大于1
点赞 回复 分享
发布于 2023-10-19 15:44 浙江
abcd这种字符串应该返回0,如果初始count设为1肯定就返回1了,不符合
点赞 回复 分享
发布于 2023-10-22 17:36 宁夏
一目了然,学到了
点赞 回复 分享
发布于 2023-12-06 23:30 广东

相关推荐

在评审的大师兄很完美:像这种一般就是部门不匹配 转移至其他部门然后挂掉 我就是这样被挂了
点赞 评论 收藏
分享
28 3 评论
分享
牛客网
牛客企业服务