您的位置:首页 > 其它

LeetCode——5最长回文子串

2019-05-18 17:32 281 查看
package exercise;

/**
* 给定一个字符串s,找到s中最长的回文子串。你可以假设 s的最大长度为1000。
*
* 示例1: 输入: “babad” 输出: “bab” 注意: “aba”也是一个有效答案。
*
* 示例2: 输入: “cbbd” 输出: “bb”
*
* 思路:利用字符串的中间位,比较中间位的左右两边的字符是否相同,找到最大的长度
*
* 让中间位k从0开始,i = k-1或k,j = k+1,比较i和j的值,
*
* 如果不同,k++;如果相同,i--,j++继续比较,直到二者不同时,最大长度是j-i-1
*/
public class Test {

public static String maxPalindrom(String s) {
int i = 0;// 定义三个指针,初始化为0
int j = 0;
int k = 0;
int mid = 0;
int len = 0;// 每次比较,得到的回文字符串的长度,初始化为0
int max = 1;// 初始化最长回文字符串的长度,初始值为1

// 如果s的长度是偶 数
while (s.length() % 2 == 0 && k < s.length() - 1) {
i = k;
j = k + 1;
while (s.charAt(i) == s.charAt(j) && i >= 0 && j < s.length()) {// 如果i和j对应的字符相等,则继续比较
i--;
j++;
}
// 如果不相等,记录下现在比较的回文字符的长度,与max比较,并记录下现在的k,以便以后取回文字串
len = j - i - 1;
if (len > max) {
max = len;
mid = k;
}
k++;
}
// 如果s的长度是奇数
k = 1;
while (s.length() % 2 != 0 && k < s.length() - 1) {
i = k - 1;
j = k + 1;
while (s.charAt(i) == s.charAt(j) && i >= 0 && j < s.length()) {// 如果i和j对应的字符相等,则继续比较
i--;
j++;
}
// 如果不相等,记录下现在比较的回文字符的长度,与max比较,并记录下现在的k,以便以后取回文字串
len = j - i - 1;
if (len > max) {
max = len;
mid = k;
}
k++;
}
//取子串的时候一定要注意子串的下标
if (max % 2 == 0) {// 取最长回文子串,如果是偶数
return s.substring(mid - max / 2 + 1, mid + max / 2 + 1);
} else {//如果是奇数
return s.substring(mid - max / 2, mid + max / 2 + 1);
}

}

public static void main(String[] args) {
String s = "cbba";
String res = maxPalindrom(s);
System.out.println("最大回文子串是" + res);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: