日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java Longest Palindromic Substring(最长回文字符串)

發布時間:2024/4/13 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java Longest Palindromic Substring(最长回文字符串) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

假設一個字符串從左向右寫和從右向左寫是一樣的,這種字符串就叫做palindromic string。如aba,或者abba。本題是這種,給定輸入一個字符串。要求輸出一個子串,使得子串是最長的padromic string。

下邊提供3種思路

1.兩側比較法

以abba這樣一個字符串為例來看,abba中,一共同擁有偶數個字。第1位=倒數第1位。第2位=倒數第2位......第N位=倒數第N位
以aba這樣一個字符串為例來看,aba中。一共同擁有奇數個字符。排除掉正中間的那個字符后,第1位=倒數第1位......第N位=倒數第N位
所以,如果找到一個長度為len1的子串后,我們接下去測試它是否滿足,第1位=倒數第1位。第2位=倒數第2位......第N位=倒數第N位。也就是說,去測試從頭尾到中點,字符是否逐一相應相等。

public class LongestPalindromicSubString1 {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(longestPalindrome1("babcbabcbaccba"));}public static String longestPalindrome1(String s) {int maxPalinLength = 0;String longestPalindrome = null;int length = s.length();// check all possible sub stringsfor (int i = 0; i < length; i++) {for (int j = i + 1; j < length; j++) {int len = j - i;String curr = s.substring(i, j + 1);if (isPalindrome(curr)) {if (len > maxPalinLength) {longestPalindrome = curr;maxPalinLength = len;}}}}return longestPalindrome;}public static boolean isPalindrome(String s) {for (int i = 0; i < s.length() - 1; i++) {if (s.charAt(i) != s.charAt(s.length() - 1 - i)) {return false;}}return true;} } </span>

?2.動態規劃法

如果dp[ i ][ j ]的值為true,表示字符串s中下標從 i 到 j 的字符組成的子串是回文串。那么能夠推出:
??? dp[ i ][ j ] = dp[ i + 1][ j - 1] && s[ i ] == s[ j ]。
??? 這是一般的情況,因為須要依靠i+1, j -1,所以有可能 i + 1 = j -1, i +1 = (j - 1) -1,因此須要求出基準情況才干套用以上的公式:
??? a. i + 1 = j -1,即回文長度為1時,dp[ i ][ i ] = true;
??? b. i +1 = (j - 1) -1,即回文長度為2時,dp[ i ][ i + 1] = (s[ i ] == s[ i + 1])。
??? 有了以上分析就能夠寫出代碼了。

須要注意的是動態規劃須要額外的O(n2)的空間。

public class LongestPalindromicSubString2 {public static String longestPalindrome2(String s) {if (s == null)return null;if(s.length() <=1)return s;int maxLen = 0;String longestStr = null;int length = s.length();int[][] table = new int[length][length];//every single letter is palindromefor (int i = 0; i < length; i++) {table[i][i] = 1;}printTable(table);//e.g. bcba//two consecutive same letters are palindromefor (int i = 0; i <= length - 2; i++) {//System.out.println("i="+i+" "+s.charAt(i));//System.out.println("i="+i+" "+s.charAt(i+1));if (s.charAt(i) == s.charAt(i + 1)){table[i][i + 1] = 1;longestStr = s.substring(i, i + 2);} }System.out.println(longestStr);printTable(table);//condition for calculate whole tablefor (int l = 3; l <= length; l++) {for (int i = 0; i <= length-l; i++) {int j = i + l - 1;if (s.charAt(i) == s.charAt(j)) {table[i][j] = table[i + 1][j - 1];if (table[i][j] == 1 && l > maxLen)longestStr = s.substring(i, j + 1);} else {table[i][j] = 0;}printTable(table);}}return longestStr;}public static void printTable(int[][] x){for(int [] y : x){for(int z: y){//System.out.print(z + " ");}//System.out.println();}//System.out.println("------");}public static void main(String[] args) {System.out.println(longestPalindrome2("1263625"));//babcbabcbaccba} }</span>

3.中心擴展法

由于回文字符串是以中心軸對稱的,所以假設我們從下標 i 出發。用2個指針向 i 的兩邊擴展推斷是否相等,那么僅僅須要對0到
n-1的下標都做此操作,就能夠求出最長的回文子串。但須要注意的是,回文字符串有奇偶對稱之分,即"abcba"與"abba"2種類型。
因此須要在代碼編寫時都做推斷。
???? 設函數int Palindromic ( string &s, int i ,int j) 是求由下標 i 和 j 向兩邊擴展的回文串的長度,那么對0至n-1的下標。調用2次此函數:
???? int lenOdd =? Palindromic( str, i, i ) 和 int lenEven = Palindromic (str , i , j ),就可以求得以i 下標為奇回文和偶回文的子串長度。


???? 接下來以lenOdd和lenEven中的最大值與當前最大值max比較就可以。
???? 這種方法有一個優點是時間復雜度為O(n2),且不須要使用額外的空間。

public class LongestPalindromicSubString3 {public static String longestPalindrome(String s) {if (s.isEmpty()) {return null;}if (s.length() == 1) {return s;}String longest = s.substring(0, 1);for (int i = 0; i < s.length(); i++) {// get longest palindrome with center of iString tmp = helper(s, i, i);if (tmp.length() > longest.length()) {longest = tmp;}// get longest palindrome with center of i, i+1tmp = helper(s, i, i + 1);if (tmp.length() > longest.length()) {longest = tmp;}}return longest;}// Given a center, either one letter or two letter,// Find longest palindromepublic static String helper(String s, int begin, int end) {while (begin >= 0 && end <= s.length() - 1&& s.charAt(begin) == s.charAt(end)) {begin--;end++;}String subS = s.substring(begin + 1, end);return subS;}public static void main(String[] args) {System.out.println(longestPalindrome("ABCCBA"));//babcbabcbaccba} }</span>

?

總結

以上是生活随笔為你收集整理的Java Longest Palindromic Substring(最长回文字符串)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产麻豆精品视频 | 国产农村妇女毛片精品久久麻豆 | 亚洲色图自拍 | 欧美激情精品久久久久久蜜臀 | 欧美三区在线 | 中文字幕2018| 欧美人妖另类 | 欧美色国 | 强侵犯の奶水授乳羞羞漫虐 | 日本高清久久 | 亚洲伊人久久久 | 人人看人人爽 | 国产精品27p| 亚洲女同视频 | 北条麻妃一区二区三区在线观看 | 岛国av网站 | 亚一区二区 | 国产黄在线免费观看 | 亚洲精品自拍偷拍 | 黄色大片日本 | 亚洲国产精品久久久久久6q | 久久久久久激情 | 日韩少妇毛片 | a级片一区二区 | 91桃色网站 | 91精品亚洲| 亚洲免费黄色网 | 亚洲国产精品久久AV | 国产一二三级 | 波多野结衣 久久 | 日日爽天天 | 多男调教一女折磨高潮高h 国内毛片毛片毛片毛片毛片 | 久久免费视频观看 | 99热首页 | 老女人一区 | 日本午夜一区二区三区 | 激情小说亚洲图片 | 亚洲国产精品久久久久婷蜜芽 | 色欲色香天天天综合网www | 精品久久亚洲 | 亚洲成人高清在线 | 天堂精品 | 91少妇丨porny丨| 亚洲不卡中文字幕 | 亚洲国产精品99久久久久久久久 | 一区二区三区免费网站 | 国产伦精品一区二区三区网站 | av第一区 | 亚洲一级无毛 | 国产精品.www | 精品视频一二三区 | 蜜臀久久99精品久久久无需会员 | 写真福利片hd在线播放 | 夜色88v精品国产亚洲 | 99久久夜色精品国产亚洲 | 成人免费大全 | 欧美日韩国产在线一区 | 都市激情亚洲 | 日本三级一区 | 少妇脱了内裤让我添 | 国产一级片自拍 | 欧美 国产 精品 | 国产一线二线三线女 | 人人人插 | 一区二区三区日本视频 | 日韩激情在线播放 | 尤物在线视频观看 | 成人伊人 | 进去里视频在线观看 | 97在线免费观看视频 | 日韩一区二区三区在线视频 | 奇米色777 | 亚洲一区亚洲二区 | 手机在线成人av | 91精品国产一区二区 | 亚洲美女啪啪 | 精品一区二区在线视频 | 国产成人综合欧美精品久久 | 超碰人人做 | 欧美亚洲在线播放 | 91成人免费在线观看视频 | 让人下面流水的视频 | 黑人一级黄色片 | 欧洲裸体片| 国产视频一区二区三区在线 | 91精品国产高清91久久久久久 | 婷婷综合在线视频 | 国产一级做a | 69xav| 污片在线观看 | 亚洲av无码一区二区三区四区 | 尤物视频在线免费观看 | 91艹 | 一曲二曲三曲在线观看中文字幕动漫 | 日韩欧美国产视频 | 亚洲欧洲日韩av | 欧美日韩一区二区在线视频 | 欧美人与性囗牲恔配 | 日本成人在线视频网站 |