leetcode题目
分析
两个指针从候选回文子串的中点开始向两边扩散
有两种情况:回文子串长度为奇数,中点指向一个字符。长度为偶数,中点指向两个字符中间。
1.中点指向一个字符
2.中点指向两个字符中间
package com.company.test1;
public class Test5 {
public static void main(String[] args) {
String s="ac";
// 中点指的是回文子串的中点
// 有两种情况:回文子串长度为奇数,中点指向一个字符。长度为偶数,中点指向两个字符中间。
// 1.中点指向一个字符
int max=0;
int begin=0,end=0;
int maxBegin=0,maxEnd=0;
char[] arr = s.toCharArray();
if(arr.length==1){
System.out.println(s);
}else if(s.length()==2){
if(arr[0]==arr[1]){
System.out.println(s);
}else{
System.out.println(arr[0]+"");
}
}
for (int i = 1; i < arr.length-1; i++) {
int len=1;
int j=1;
for ( ; i+j<arr.length&&i-j>=0; j++) {
if(arr[i-j]==arr[i+j]){
len+=2;
}else{
break;
}
}
System.out.println((i-j+1)+","+(i+j-1));
System.out.println("------------");
// System.out.println(len);
if(len>max){
max=len;
maxBegin=i-j+1;
maxEnd=i+j-1;
}
}
// System.out.println(arr[maxBegin]+","+arr[maxEnd]);
System.out.println(maxBegin+","+maxEnd);
// 2.中点指向两个字符中间
// double i=3.5;
for (double i = 0.5; i <arr.length-1 ; i++) {
System.out.println(i);
int len=1;
double j = 0.5;
for (; i+j<arr.length&&i-j>=0 ; j++) {
System.out.println(arr[(int)(i-j)]+","+arr[(int)(i+j)]);
if(arr[(int)(i-j)]==arr[(int)(i+j)]){
len+=2;
}else{
break;
}
}
if(len>max){
max=len;
maxBegin=(int)(i-j)+1;
maxEnd=(int)(i+j)-1;
}
}
System.out.println(arr[maxBegin]+","+arr[maxEnd]);
StringBuilder builder=new StringBuilder();
for (int i = maxBegin; i <=maxEnd ; i++) {
builder.append(arr[i]);
}
System.out.println(builder.toString());
System.out.println(maxBegin+","+maxEnd);
}
}
先在b站上学习算法入门视频,然后再做此类题目会更加容易。