最長迴文子串兩種解法
阿新 • • 發佈:2018-12-14
刷leetcode...
給定一個字串 s
,找到 s
中最長的迴文子串。你可以假設 s
的最大長度為 1000。
示例 1:
輸入: "babad" 輸出: "bab" 注意: "aba" 也是一個有效答案。
示例 2:
輸入: "cbbd" 輸出: "bb"
思路:遍歷每一個字元,以字元為中心,將字串對摺,如果對應的字元相等,則可以確認該字串為迴文串。
下面是第一次的解法,在每個字元中間插入一個間隔符,如s="abb",插入間隔符之後變成str="a#b#b",插入間隔符之後不會影響原迴文字元的順序。
package Algorithms; public class palindromic_substring5 { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(longestPalindrome("abb")); } //耗時671ms public static String longestPalindrome(String s) { if(s != null && !s.equals("")) { String re = s.substring(0,1); String temps = s.substring(0,1); int max = 1; int temp = 1; String str = ""; int length = 2*s.length() - 1; int count = 0; for(int i = 0;i < s.length();i ++) { str = str + s.charAt(i); if(count < length) { str = str + "#"; } } for(int i = 0;i < length;i ++) { boolean isExist = true; int j = i - 1; int k = i + 1; while(j >= 0 && k < length && isExist) { if(str.charAt(j) != str.charAt(k)) { temps = str.substring(j + 1, k); isExist = false; }else { j --; k ++; } } if(temps.equals("")) { temps = str.substring(j+1, k); } temps = temps.replaceAll("#", ""); temp = temps.length(); if(temp > max) { re = temps; max = temp; } temps = ""; } return re; }else { return s; } } }
經過思考,將上述方法進行改進,不需要往字串中插入間隔符
package Algorithms; public class palindromic_substring5 { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(longestPalindrome("abb")); } //耗時97ms public static String longestPalindrome(String s) { if(s != null && !s.equals("")) { String re = s.substring(0,1); String temps = ""; int max = 1; int temp = 0; for(int i = 0;i < s.length();i ++) { boolean isExist = true; int j = i, k = i; while(j >= 0 && k < s.length() && isExist) { if(s.charAt(j) != s.charAt(k)) { temps = s.substring(j + 1, k); isExist = false; } else { if((k+1) < s.length() && (j-1) >= 0 && s.charAt(j-1) == s.charAt(k+1)) { //continue; }else if((k+1) < s.length() && s.charAt(j) == s.charAt(k+1)) { if(isPalindromicSubstring(s.substring(j,k+2))) { j ++; } } j --; k ++; } } if(temps.equals("")) { temps = s.substring(j+1, k); } temp = temps.length(); if(temp > max) { re = temps; max = temp; } temps = ""; if(k >= s.length()) { break; } } return re; }else { return s; } } //判斷是否為迴文串 public static boolean isPalindromicSubstring(String s) { if(s.length() == 1) { return true; } char[] ch = s.toCharArray(); for(int i = 0;i < ch.length/2; i++) { if(s.charAt(i) != ch[ch.length - 1 - i]) { return false; } } return true; } }
變快了很多。
看提交記錄中的耗時分佈圖,最快的居然只用了6ms,而且耗時在20-30ms內的解法還很多,感慨一句自己真是很辣雞啊