Java实现查找当前字符串最大回文串代码分享

所属分类: 软件编程 / java 阅读数: 42
收藏 0 赞 0 分享

先看代码

public class MaxHuiWen {
 
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    String s = "abb";
    MaxHuiWen(s);
  }
   
  //1.输出回文串
  public static void MaxHuiWen(String s){
    //存储字符串的长度
    int length = s.length();
    //存储最长的回文串
    String MaxString = "";
    //遍历当前字符串的所有子串
    for(int i = 0 ; i < length ; i++){
      for(int j = i ; j < length + 1 ; j++){
        String s1 = s.substring(i , j);
        //如果当前字符串为回文串并且大于MaxString的长度,就替换当前MaxString
        if(HuiWen(s1) && s1.length() > MaxString.length()){
            MaxString = s1;
        }
        //System.out.println(s1);
      }
    }  
    //如果MaxString长度大于等于2,说明是回文串
    if(MaxString.length() >= 2){
      System.out.println(MaxString);
    }
    else{
      System.out.println("没有回文串");
    }
     
  }
   
  //2.判断字符串是否为回文串
  public static boolean HuiWen(String s){
    boolean flag = true;
    int length = s.length();
    char s1[] = s.toCharArray();
    //从前,从后,遍历字符串,进行比较
    for(int i = 0 , j = length - 1 ; i <= j ; i++ , j--){
      if(s1[i] != s1[j]){
        flag = false;
      }
    }
    return flag;
  }
   
}

一,字符串的回文判断

判断一个字符串是否为回文

问题描述,给定一个字符串,如String T="madam";要判断该字符串是否为回文

方法一:1,定义两个字符串元素指针(注意java没有指针的概念),int right=T.length()-1 ;int left=0;

2,即left从左边开始,right从右边开始,依次比较所指的字符是否相等,若相等,则将left++,right--;否则,直接返回不是回文

while(left<right){

if(T.charAt(left)!=T.charAt(right))

return false;

left++;

right--;

}

return true;

代码:

/* 
   * 3: 
   * 回文判断 
   * 问题描述:回文,英文palindrome,指一个顺着读和反过来读都一样的字符串,比如madam、我爱我, 
   * 方法一: 
   * 分析:使用两个"指针"分别从字符串头和尾扫描,若每一个"指针"所指值都相等,这为回文 
   */ 
  public boolean isPalindrome(String s){ 
    if(s==null) 
      return false; 
    int left=0; 
    int right=s.length()-1; 
    while(left<right){ 
      if(s.charAt(left)!=s.charAt(right)) 
        return false; 
      left++; 
      right--; 
    } 
    return true; 
  } 


方法二:回文字符串如"madam",若将其全部反转,则还是得到其本身"madam",在将两个字符串比较,若相等,则为回文

1,实现一个将字符串反转的函数

/* 
 * 实现一个字符串的反转函数 
 */ 
private String reverse(String str){ 
  String strResult=""; 
  for(int i=str.length()-1;i>=0;i--){ 
    strResult+=str.charAt(i); 
  } 
  return strResult; 
} 
2,对于目标字符串s,首先将其反转temp=reverse(s),然后在判断temp.equals(s)
/*
* 将字符串倒置,再与原字符串进行比较,若相等,则为回文,否则不是
* 算法时间复杂度为O(n)
*/
public boolean isPalindrome2(String s){
String temp=reverse(s);
if(s.equals(temp))
return true;
else
return false;
}

二:如何求一个给定字符串的最大回文字符串

例如,给定字符串String T="google",如何求其最长的回文子字符串"goog"

1,最简单直接的想法就是:找出字符串的所有子串,然后判断每一个子串是否是回文,并记录,比较求出最大长度的回文,*算法时间复杂度为O(n^3)

/* 
 * 4,求最长回文子串 
 *问题描述:给定一个字符串求出其所有子串中最长的回文子串,例如google字符串,最长子串为goog 
 *分析: 
 *1,最简单直接的想法就是:找出字符串的所有子串,然后判断每一个子串是否是回文,并记录,比较求出最大长度的回文 
 *算法时间复杂度为O(n^3) 
 */ 
public String longestPalindrome1(String s){ 
  String result=null; 
  String tempString=""; 
  //定义最长回文子串的长度 
  int max=0; 
  //遍历字符串中的所有元素 
  for(int i=0;i<s.length();i++){ 
    //数组下标指针j从字符串后面开始往前遍历 
    for(int j=s.length()-1;j>i;j--){ 
      //判断每一个字符串时候为回文 
      tempString=s.subStr( i, j+1); 
      //如果tempString是回文子串并且其长度(j-i+1)>max 
      if(isPalindrome(tempString)&&(j-i+1)>max){ 
        max=j-i+1; 
        result=subString(i, j+1); 
      } 
    } 
  } 
  return result; 
} 

2,第二种思路就是对于字符串中的每一个字符T[i],判断 

以T[i],T[i+1]为中心的偶数长度子字符串是回文 

T[i]为中心的奇数长度子字符串是否是回文 

public String longestPalindrome2(String T){ 
    String result=null; 
    //存放最大回文字符串的长度 
    int max=0; 
    //遍历每一个字符,以每一个字符为中心判断奇偶扩展子串 
    for(int i=0;i<T.length();i++){ 
      //定义两个数组下标指针,以i,i+1为中心的偶子序列 
      int pStart=i; 
      int pEnd=i+1; 
      while(pStart>=0&&pEnd<=(T.length()-1)&&T.charAt(pStart)==T.charAt(pEnd)){ 
        pStart--; 
        pEnd++; 
      } 
      //如果子字符串的长度>max,则暂存为最长子回文串 子回文串的长度=(pEnd-1)-(pStart+1)-1=pEnd-pStart-1 
      if(pEnd-pStart-1>max){ 
        max=pEnd-pStart-1; 
        result=subString( pStart+1, pEnd-1+1); 
      } 
       
      //以i为中心,判断扩展奇序列是否为回文串 
      pStart=i-1; 
      pEnd=i+1; 
      while(pStart>=0&&pEnd<=(T.length()-1)&&T.charAt(pStart)==T.charAt(pEnd)){ 
        pStart--; 
        pEnd++; 
      } 
      if (pEnd-pStart-1>max) { 
        max=pEnd-pStart-1; 
        result=subStrint(T, pStart+1, pEnd-1+1); 
      } 
    } 
    return result; 
  } 

更多精彩内容其他人还在看

Java的面向对象编程基本概念学习笔记整理

这篇文章主要介绍了Java的面向对象编程基本概念学习笔记整理,包括类与方法以及多态等支持面向对象语言中的重要特点,需要的朋友可以参考下
收藏 0 赞 0 分享

Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法

这篇文章主要介绍了Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

基于Java实现杨辉三角 LeetCode Pascal's Triangle

这篇文章主要介绍了基于Java实现杨辉三角 LeetCode Pascal's Triangle的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java中Spring获取bean方法小结

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢?下面通过本文给大家介绍Java中Spring获取bean方法小结,对spring获取bean方法相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

如何计算Java对象占用了多少空间?

在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小,需要的朋友可以参考下
收藏 0 赞 0 分享

剖析Java中的事件处理与异常处理机制

这篇文章主要介绍了Java中的事件处理与异常处理机制,讲解Java是如何对事件或者异常作出响应以及定义异常的一些方法,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Java的Struts2框架的结构及其数据转移方式

这篇文章主要介绍了详解Java的Struts2框架的结构及其数据转移方式,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

Java封装好的mail包发送电子邮件的类

本文给大家分享了2个java封装好的mail包发送电子邮件的类,并附上使用方法,小伙伴们可以根据自己的需求自由选择。
收藏 0 赞 0 分享

在Java的Struts中判断是否调用AJAX及用拦截器对其优化

这篇文章主要介绍了在Java的Struts中判断是否调用AJAX及用拦截器对其优化的方法,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

java多线程Future和Callable类示例分享

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们就来研究下Future和Callab
收藏 0 赞 0 分享
查看更多