最长回文字串
输入一个字符串,求出其中最长的回文字串.子串的含义是:在原串中连续出现的字符串片段.
会问的含义是:正着看和倒着看相同,如abba和yyxyy.
package practice;
import java.util.Scanner;
/**
* @author jins
* @date on 2019/1/15.
*/
public class Palindrome {
private static int maxLen = 0;
private static int max = 0;
public static void main(String[] args){
// 采用的是从中间往两边验证方式
Scanner scanner = new Scanner(System.in);
// 读取一行字符串
String s = scanner.nextLine();
// 把字符串转换成字符数组.
char [] ch = s.toCharArray();
bruteForce(ch);
for ( int i=0;i<ch.length;i++ )
{
//从第i个元素,向两边扩散,这个是假设回文数的个数为奇数,如aba形式
// i-j是从中间向左边扩散,i+j是从中间向右边扩散.
for ( int j=0;i-j>=0 && i+j< ch.length;j++ )
{
//如果从中间向两边去的元素不相等,那么没有回文,直接退出!
if (ch[i-j] != ch[i+j]) {
break;
}
// 如果从中间向两边的数据都相等,那么统计数据.因为是假设回文是奇数,所以回文数的个数为j*2+1
//因为i是走到第几个数据,j=1为中间数据旁边的两个数据,所以j*2表示两边对称的个数,因为是奇数,所以还得加上中间的数
if (j*2+1>maxLen){
maxLen = j*2+1;
}
}
//这个是假设回文数据为偶数,如abba
// i表示当前的这个元素,i-j当j=0时,表示第i个元素,i+j+1,表示向后面的一个元素
for ( int j=0;i-j>=0 && i+j+1<ch.length;j++ ){
if(ch[i-j] != ch[i+j+1]){
break;
}
if (j*2+2>maxLen){
maxLen = j*2+2;
}
}
}
//输出最大元素
System.out.println("从中间往两边查找:"+maxLen);
}
private static void bruteForce(char [] ch){
for ( int i=0 ;i <ch.length;i++ ){
for ( int j=i ; j<ch.length ; j++ ){
int ok = 1;
for ( int k=i;k<=j;k++ ){
if (ch[k] != ch[i+j-k]){
ok=0;
}
}
if (ok>=1 && j-i+1> max){
max = j-i+1;
}
}
}
System.out.println("暴力破解:"+max);
}
}
如果大家喜欢我的文章,可以关注我的微信公众号,后面会陆续更新!