leetcode 求最長迴文串
阿新 • • 發佈:2018-10-31
題目:Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
樣例:“babad” 答案為 : "aba"
題目大意:給定一個字串,找出該字串中最長的迴文串,資料範圍為1000長度。
1).首先一個字串的長度分為 偶數 和 奇數,那麼問題就可以劃分為2個小問題,第一個就是當字串是奇數的時候,那麼該字串肯定關於中間某個字元對稱("ababa" 該字串關於a對稱),第二個就是當字串為偶數的時候,那麼該字串就是關於某個“縫隙”對稱(“abba”就是關於兩個b中間的縫隙對稱)。
3>.經過了問題劃分,接下來就是遍歷 暴力求解的過程了,大體思路就是:設定一個存 答案 的字串longest並初始化為第一個字元長度(就是初始化為一),接下來每一次運算都要處理上述第二條說說的兩種情況,進行暴力求解。
樣例:“babad” 答案為 : "aba"
題目大意:給定一個字串,找出該字串中最長的迴文串,資料範圍為1000長度。
這個題大致解體思路是這樣的:
1>.首先要明白迴文串的含義 就是一個字串從中間對稱(也就是說一個字串從中間開始兩邊都是相同的字元)2>.明白了迴文串,那麼接下來的問題就是問題分類了:
3>.經過了問題劃分,接下來就是遍歷 暴力求解的過程了,大體思路就是:設定一個存 答案 的字串longest並初始化為第一個字元長度(就是初始化為一),接下來每一次運算都要處理上述第二條說說的兩種情況,進行暴力求解。
4>.程式碼如下:
public class Main { public String expend(String s,int c1,int c2){ int left = c1;int right = c2; int n = s.length();//求得傳入字串長度 while(left >= 0 && right <= n-1 && s.charAt(left) == s.charAt(right)){ left--; right++; } if(left == c1 && right == c2){ return ""; //這裡當不操作時,就返回空串,直接就不考慮會影響答案!! }else{ return s.substring(left+1, right); //一旦left right被改變 最後一次操作左邊就多減了一次 右邊就多加了一次!!! 所以這裡java substring要這樣寫 } } public String longestPalindrome(String s){ int n = s.length(); if(n==0) return ""; String longest = s.substring(0, 1); for(int i=0;i<n-1;i++){ //遍歷查詢 每個結點有兩種情況 整個字串是奇數 或者 整個字串是偶數 String p1 = expend(s, i, i); //處理字串是奇數的情況 if(p1.length() > longest.length()){ longest = p1; } String p2 = expend(s,i,i+1); //處理字串是偶數的情況 if(p2.length() > longest.length()){ longest = p2; } } return longest; } public static void main(String[] args){ Main m = new Main(); System.out.println(m.longestPalindrome("babad")); } }