Java实现查找当前字符串最大回文串代码分享
作者:hebedich 发布时间:2023-07-30 04:05:02
标签:java,回文字符串
先看代码
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;
}


猜你喜欢
- 在开发Android App过程中,经常会遇见这样的功能。从当前的app跳转到一个应用商店并且跳转到自己app的详情页面,让用户给自己的Ap
- Webview打开本地图片选择器十分之麻烦,其在安卓系统3x 4x 5x上的行为都不同,处理也不同,所以之前差点崩溃。经过测试和完善,最终其
- 本文以实例形式展示了C#判等对象是否相等的常用方法,非常实用,可供大家参考借鉴之用。具体分析如下:一、判断相等的3个方法1.实例方法publ
- 1.Java内存模型JAVA定义了一套在多线程读写共享数据时时,对数据的可见性、有序性和原子性的规则和保障。屏蔽掉不同操作系统间的微小差异。
- Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入
- 本文实例讲述了C#序列化与反序列化的方法。分享给大家供大家参考。具体分析如下:把“对象”转换为“字节序列”的过程称为对象的序列化。 
- 关于Spring Data JPA中自定义sql 条件的 in参数记录此文做一个记录,以便以后观看,也希望正在遇到同样问题的同学能有所启发,
- 今天跟大家分享一个利用外部Jar包来实现Java操作CSV文件一.资源下载1.直接下载Jar包:javacsv-2.0.jar2.利用Mav
- 喜欢另辟蹊径的我,在这里废话不多说了,直接上代码和图片了。效果图如下:第一步:MainActivity的代码如下:package net.l
- 某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后除以10的余数代替该数字,再将第一
- 前言本文详细介绍如何使用spring-boot2.x快速整合log4j2日志框架。spring-boot2.x使用logback作为默认日志
- 前言可能对于很多新人来讲,看到这个题目,想到的能接收输入法输入的内容大概只有EditText和TextView这两个控件了,其实不然,只要是
- 在我们开发过程中用 Mybatis 经常会用到下面的例子Mapper如下Map<String ,String > testArr
- java中map与实体类的相互转换1. 在 pom.xml 中引入依赖包<dependency> <grou
- 判断是否为飞行模式: boolean isAirplaneMode = Settings.System.getInt(mConte
- 1. 效果图展示2. 工程目录结构注意: webapp下的resources目录放置easyui和js(jQuery文件是另外的) 
- 本文实例讲述了Android编程判断当前应用是否在后台运行的方法。分享给大家供大家参考,具体如下:/** 判断程序是否在后台运行 */pub
- 当你使用synchronized关键字的时候,是通过互斥器来保障线程安全以及对共享资源的同步访问。线程间也经常需要更进一步的协调
- 今天看见一个Android 扑克卡片翻转效果的帖子,于是手痒想学一学,由于接触过的Animation动画等比较少,所以感觉很新奇。首先,说一
- 在上章C++图解单向链表类模板和iterator迭代器类模版详解我们学习了单链表,所以本章来学习双向循环链表我们在上个文章代码上进行修改,