5. Longest Palindromic Substring(求最長迴文子字串)
阿新 • • 發佈:2019-01-04
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example:
Input: "babad" Output: "bab" Note: "aba" is also a valid answer.
Example:
Input: "cbbd" Output: "bb"題目大意:給定一個字串,找到最長的迴文子串。 解法一:
解題思路:迴文字串有兩種情況:長度為奇數,或者長度為偶數。現在分別以這兩種情況進行解題,兩個int型別的指標left和right,分別向兩側延伸,以找到長度最大的迴文子字串。
解法二:class Solution { public String longestPalindrome(String s) { if (s.length() <= 1) { return s; } int left, right; String res = s.substring(0, 1); for (int i = 0; i < s.length(); i++) { left = right = i; while (left > -1 && right < s.length() && s.charAt(left) == s.charAt(right)) { left--; right++; } if (right - left - 1 > res.length()) { res = s.substring(left + 1, right); } } for (int i = 0; i < s.length() - 1; i++) { left = i; right = i + 1; while (left > -1 && right < s.length() && s.charAt(left) == s.charAt(right)) { left--; right++; } if (right - left - 1 > res.length()) { res = s.substring(left + 1, right); } } return res; } }
解題思路:動態規劃 解題程式碼:(180ms,beats 1.67%)
class Solution { public String longestPalindrome(String s) { int sLen = s.length(); if (sLen <= 1) { return s; } boolean[][] isPalindrome = new boolean[sLen][sLen]; // 初始化,i=j時只有一個字元,是迴文字串。i>j時是空串,也視為迴文字串。i<j時先預設初始化為false。 for (int i = 0; i < sLen; i++) { for (int j = 0; j < sLen; j++) { if (i < j) { isPalindrome[i][j] = false; } else { isPalindrome[i][j] = true; } } } int left = 0, right = 0; for (int step = 1; step < sLen; step++) { for (int i = 0; i + step < sLen; i++) { int j = i + step; if (s.charAt(i) != s.charAt(j)) { isPalindrome[i][j] = false; } else { isPalindrome[i][j] = isPalindrome[i + 1][j - 1]; if (isPalindrome[i][j] == true) { if (j - i > right - left) { left = i; right = j; } } } } } return s.substring(left, right + 1); } }