LeetCode精选题之——5. 最长回文子串(暴力解法)

           北京时间2022年04月07日,晚23:03分。天气晴朗,温度稍热。今天从公司正式离职了,干了一年,是时候得重谋出路了。话不多说,先来刷一道LeetCode题,最长回文子串。

 

 

思路:

        先来个最简单的也是最基础的暴力解法,枚举法。回文串,顾名思义就是对称的一种字符串,所以第一层循环先枚举第一位字符,第二层循环依次把其后面的字符串枚举出来,检验对[i,j]的字符串判断是否回文串,如果是的话就更新当前最长长度maxLength和开始下标begin。

第一层的第一个字符枚举后,则进行下一个字符继续枚举,此时就可以使用j-i+1是否大于maxLength去判断是否可以跳过某些不必要的枚举(因为是求最长回文串)。

代码实现:

public static void main(String[] args) {
String s="ABCBA";
String result = solution(s);
}
public static String solution(String s){
int len = s.length();
if (len<2){
// 长度为0或者1的时候,就是最简单的回文串
return s;
}
char[] sArray = s.toCharArray();

// 需要初始化时候的maxLen和begin
int maxLength = 1;
int begin = 0;

for (int i=0;i<len;i++){
// 从后面一位开始枚举
// ABC 和 ABBA 为例子
for (int j = i+1;j<len;j++){
// ①当i到j的是回文串的时候
// ②并且当前nowLength的长度要大于当前最长回文串的时候(因为是双重for循环,避免AAA这种,当i>0时会重复更新maxLength和begin),更新maxLength和begin
int nowLength = j-i+1;
if (valid(sArray,i,j) && nowLength>maxLength){
// j-i+1 因为下标是从0开始的
maxLength=nowLength;
begin = i;
}
}
}
return s.substring(begin,begin+maxLength);
}

// 检验函数
public static boolean valid(char[] array,int left,int right){
while (left<right){
if (array[left]==array[right]){
left++;
right--;
}else {
return false;
}
}
return true;
}

 

posted @ 2022-04-07 23:12  卓不庭  阅读(77)  评论(0编辑  收藏  举报