由于文章评论里面贴代码出现BUG,所以开了篇文章上代码
文章链接:https://blog.csdn.net/liuzhixiong_521/article/details/87158837
如题:给定一个字符串 str,找到 s 中最长的回文子串。
示例
输入1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
输入2:
输入: "cbbd"
输出: "bb"
public void test2(){
String str = "babcba";
int maxLength = 1; //最长的回文串长度
String subString = "";
int len = str.length();
boolean flag = false; //当前迭代回文串存是否存在
int num = 0;//循环次数计数器
for(int i = 2;i <= len;i++){
for(int j = 0;j + i <= len;j++){
if((i - 1) != maxLength && (i - 2) != maxLength)
break;
if(flag){
flag=false;
continue;
}
String subStr=str.substring(j,j + i);
if(check(subStr)){
maxLength = i;
if(subString.length() < maxLength) {
subString = subStr;
}else{
flag=true;
}
break;
}
}
if(maxLength - num == len) break;//寻找到逻辑上最长字符串后直接跳出循环
++num;
}
System.out.println("最长子串:"+subString);
}
/**
* 判断是否存在回文串
* @param subString
* @return
*/
private boolean check(String subString) {
int length = subString.length();
int mid = length / 2;
for (int i = 0; i < mid; i++) {
if (subString.charAt(i) != subString.charAt(length - i - 1))
return false;
}
return true;
}
尴了个尬,写了半天感觉还是没大哥写的好,以下是大哥的代码~~
public String longestPalindrome(String s) {
char[] chars = new char[2 * s.length() + 1];
for (int i = 0; i < s.length(); i++) {
chars[2 * i] = '#';
chars[2 * i + 1] = s.charAt(i);
}
chars[chars.length - 1] = '#';
int max = 0;
int idx = 0;
for (int i = 0; i < chars.length; i++) {
int k = 0;
while (i - k >= 0 && i + k < chars.length && chars[i - k] == chars[i + k]) {
k++;
}
if (k > max) {
max = k;
idx = i;
}
}
String res = String.valueOf(chars).substring(idx - max + 1, idx + max);
return res.replaceAll("#", "");
}
不过坚强的我还是找到了可以优化的地方:
[1] 数组长度放在for循环的条件中造成每次循环都需要通过对象指针去找属性值,可以提取出来
[2]代码中for i循环可以从1开始循环因为从0开始没什么意义
[3]同类型的变量可以在一行声明并赋予默认值
public void test() {
String s = "abacab";
char[] chars = new char[2 * s.length() + 1];
for (int i = 0; i < s.length(); i++) {
chars[2 * i] = '#';
chars[2 * i + 1] = s.charAt(i);
}
int length = chars.length;
chars[length - 1] = '#';
int max = 0,idx = 0;
for (int i = 1; i < length; i++) {
int k = 0;
while (i - k >= 0 && i + k < length && chars[i - k] == chars[i + k]) {
k++;
}
if (k > max) {
max = k;
idx = i;
}
}
String res = String.valueOf(chars).substring(idx - max + 1, idx + max);
System.out.println(res.replaceAll("#", ""));
}