题解 | #密码截取#

密码截取

https://www.nowcoder.com/practice/3cd4621963e8454594f00199f4536bb1

import java.util.Scanner;

//最长回文子串的长度问题。
//思路:
/**
1, 通过双重for循环,对字符串进行截取并反转,和截取的字符串进行对比是否一样
 */

//暴力解法,未优化版本,运行会超时
// public class Main {
//     public static void main(String[] args) {
//         Scanner in = new Scanner(System.in);
//         String s = in.nextLine();
//         int maxLen = 0;
//         for (int i = 0; i < s.length(); i++) {
//             for (int j = s.length(); j > i; j--) {

//                 String subStr = s.substring(i, j);
//                 if (subStr.equals(new StringBuilder(subStr).reverse().toString())) {
//                     if (subStr.length() >= maxLen) {
//                         maxLen = subStr.length();
//                     }

//                 }
//             }
//         }

//         System.out.println(maxLen);

//     }
// }

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        int maxLen = 0;
        for (int i = 0; i < s.length(); i++) {
            for (int j = s.length()-1; j > i; j--) {
                //优化开始
                int a = i;
                int b = j;
                //找到相同的元素,继续往里比较,直到相遇,或者相邻,因为回文有两种形式,aba, abbc
                while (s.charAt(a) == s.charAt(b)) {
                    //直到以下条件
                    if (a == b || b - a == 1) {
                        //求最大长度
                        maxLen = (j - i + 1) >= maxLen ? j - i + 1 : maxLen;
                        break;
                    }
                    //指针继续缩小范围比较
                    a++;
                    b--;
                }
                //如果没有已知的最长长直接跳出循环
                if (j - i <= maxLen) {
                    break;
                }

            }
        }

        System.out.println(maxLen);

    }
}

全部评论

相关推荐

10-29 15:51
嘉应学院 Java
后端转测开第一人:你把简历的学历改成北京交通大学 去海投1000份发现基本还是没面试
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务