Java實(shí)現(xiàn)查找當(dāng)前字符串最大回文串代碼分享
先看代碼
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){ //存儲(chǔ)字符串的長度 int length = s.length(); //存儲(chǔ)最長的回文串 String MaxString = ""; //遍歷當(dāng)前字符串的所有子串 for(int i = 0 ; i < length ; i++){ for(int j = i ; j < length + 1 ; j++){ String s1 = s.substring(i , j); //如果當(dāng)前字符串為回文串并且大于MaxString的長度,就替換當(dāng)前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(); //從前,從后,遍歷字符串,進(jìn)行比較 for(int i = 0 , j = length - 1 ; i <= j ; i++ , j--){ if(s1[i] != s1[j]){ flag = false; } } return flag; } }
一,字符串的回文判斷
判斷一個(gè)字符串是否為回文
問題描述,給定一個(gè)字符串,如String T="madam";要判斷該字符串是否為回文
方法一:1,定義兩個(gè)字符串元素指針(注意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,指一個(gè)順著讀和反過來讀都一樣的字符串,比如madam、我愛我, * 方法一: * 分析:使用兩個(gè)"指針"分別從字符串頭和尾掃描,若每一個(gè)"指針"所指值都相等,這為回文 */ 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",若將其全部反轉(zhuǎn),則還是得到其本身"madam",在將兩個(gè)字符串比較,若相等,則為回文
1,實(shí)現(xiàn)一個(gè)將字符串反轉(zhuǎn)的函數(shù)
/* * 實(shí)現(xiàn)一個(gè)字符串的反轉(zhuǎn)函數(shù) */ private String reverse(String str){ String strResult=""; for(int i=str.length()-1;i>=0;i--){ strResult+=str.charAt(i); } return strResult; } 2,對(duì)于目標(biāo)字符串s,首先將其反轉(zhuǎn)temp=reverse(s),然后在判斷temp.equals(s) /* * 將字符串倒置,再與原字符串進(jìn)行比較,若相等,則為回文,否則不是 * 算法時(shí)間復(fù)雜度為O(n) */ public boolean isPalindrome2(String s){ String temp=reverse(s); if(s.equals(temp)) return true; else return false; }
二:如何求一個(gè)給定字符串的最大回文字符串
例如,給定字符串String T="google",如何求其最長的回文子字符串"goog"
1,最簡單直接的想法就是:找出字符串的所有子串,然后判斷每一個(gè)子串是否是回文,并記錄,比較求出最大長度的回文,*算法時(shí)間復(fù)雜度為O(n^3)
/* * 4,求最長回文子串 *問題描述:給定一個(gè)字符串求出其所有子串中最長的回文子串,例如google字符串,最長子串為goog *分析: *1,最簡單直接的想法就是:找出字符串的所有子串,然后判斷每一個(gè)子串是否是回文,并記錄,比較求出最大長度的回文 *算法時(shí)間復(fù)雜度為O(n^3) */ public String longestPalindrome1(String s){ String result=null; String tempString=""; //定義最長回文子串的長度 int max=0; //遍歷字符串中的所有元素 for(int i=0;i<s.length();i++){ //數(shù)組下標(biāo)指針j從字符串后面開始往前遍歷 for(int j=s.length()-1;j>i;j--){ //判斷每一個(gè)字符串時(shí)候?yàn)榛匚? 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,第二種思路就是對(duì)于字符串中的每一個(gè)字符T[i],判斷
以T[i],T[i+1]為中心的偶數(shù)長度子字符串是回文
T[i]為中心的奇數(shù)長度子字符串是否是回文
public String longestPalindrome2(String T){ String result=null; //存放最大回文字符串的長度 int max=0; //遍歷每一個(gè)字符,以每一個(gè)字符為中心判斷奇偶擴(kuò)展子串 for(int i=0;i<T.length();i++){ //定義兩個(gè)數(shù)組下標(biāo)指針,以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為中心,判斷擴(kuò)展奇序列是否為回文串 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; }
相關(guān)文章
SpringBoot @ModelAttribute使用場(chǎng)景分析
這篇文章主要介紹了SpringBoot @ModelAttribute使用場(chǎng)景分析,文中通過實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-08-08利用MultipartFile實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了利用MultipartFile實(shí)現(xiàn)文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11全面解析Java支持的數(shù)據(jù)類型及Java的常量和變量類型
這篇文章主要介紹了Java支持的數(shù)據(jù)類型及Java的常量和變量類型,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-02-02SpringMVC 文件上傳配置,多文件上傳,使用的MultipartFile的實(shí)例
本篇文章主要介紹了SpringMVC 文件上傳配置,詳解介紹了如何使用SpringMVC進(jìn)行表單上的文件上傳以及多個(gè)文件同時(shí)上傳的步驟,有興趣的可以了解一下。2016-12-12詳解Eclipse Validating緩慢的優(yōu)化
這篇文章主要介紹了詳解Eclipse Validating緩慢的優(yōu)化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Spring實(shí)戰(zhàn)之緩存使用key操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之緩存使用key操作,結(jié)合實(shí)例形式分析了Spring緩存使用key具體配置、屬性、領(lǐng)域模型等相關(guān)操作技巧,需要的朋友可以參考下2020-01-01Java在OJ時(shí)運(yùn)行超時(shí)的問題解決方案
Java語言什么都好,就是在OJ的時(shí)候真的是太慢了,今天來講解一種讓Java運(yùn)行速度快速提高的方法,感興趣的朋友一起看看吧2023-11-11SpringBoot實(shí)現(xiàn)PDF添加水印的示例
本文主要介紹了SpringBoot實(shí)現(xiàn)PDF添加水印的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05SpringBoot如何打印mybatis的執(zhí)行sql問題
這篇文章主要介紹了SpringBoot如何打印mybatis的執(zhí)行sql問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03