leetcode -- Longest Palindromic Substring
2013-06-17 10:54
447 查看
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
O(n*n)。对于每一个字符,以之作为中间元素往左右寻找。注意处理奇偶两种模式:
1. aba
2. abba
find a more elegant code:http://leetcode.com/2011/11/longest-palindromic-substring-part-i.html
时间复杂度为O(n)的算法
http://leetcode.com/2011/11/longest-palindromic-substring-part-ii.html
O(n*n)。对于每一个字符,以之作为中间元素往左右寻找。注意处理奇偶两种模式:
1. aba
2. abba
public class Solution { public String longestPalindrome(String s) { // Start typing your Java solution below // DO NOT write main() function String longestPalindrome = ""; for(int i = 0; i < s.length(); i++){ // 需考虑两种情形 // aba 和 abba String oddPattern = getOddPalindromeSubstring(i, s); String evenPattern = getEvenPalindromeSubstring(i, s); if(evenPattern.length() > oddPattern.length()){ if(evenPattern.length() > longestPalindrome.length()) longestPalindrome = evenPattern; } else { if(oddPattern.length() > longestPalindrome.length()) longestPalindrome = oddPattern; } } return longestPalindrome; } // abba public String getEvenPalindromeSubstring(int index, String s){ char currentChar = s.charAt(index); int leftPointer = index - 1; int rightPointer = index + 1; //String result = ""; // 回文子串至少包含当前字符 String result = ""; result += currentChar; /* if(leftPointer >= 0 && s.charAt(leftPointer) == currentChar){ result = s.substring(leftPointer, index + 1); leftPointer --; } */ if(rightPointer < s.length() && s.charAt(rightPointer) == currentChar){ result += s.charAt(rightPointer); rightPointer ++; } while(leftPointer >= 0 && rightPointer < s.length()){ if(s.charAt(leftPointer) == s.charAt(rightPointer)){ result = s.substring(leftPointer, rightPointer + 1); leftPointer --; rightPointer ++; continue; } break; } return result; } // aba public String getOddPalindromeSubstring(int index, String s){ char currentChar = s.charAt(index); int leftPointer = index - 1; int rightPointer = index + 1; //String result = ""; String result = ""; // 回文子串至少包含当前字符 result += currentChar; while(leftPointer >= 0 && rightPointer < s.length()){ if(s.charAt(leftPointer) == s.charAt(rightPointer)){ result = s.substring(leftPointer, rightPointer + 1); leftPointer --; rightPointer ++; continue; } break; } return result; } }
find a more elegant code:http://leetcode.com/2011/11/longest-palindromic-substring-part-i.html
string expandAroundCenter(string s, int c1, int c2) { int l = c1, r = c2; int n = s.length(); while (l >= 0 && r <= n-1 && s[l] == s[r]) { l--; r++; } return s.substr(l+1, r-l-1); } string longestPalindromeSimple(string s) { int n = s.length(); if (n == 0) return ""; string longest = s.substr(0, 1); // a single char itself is a palindrome for (int i = 0; i < n-1; i++) { string p1 = expandAroundCenter(s, i, i); if (p1.length() > longest.length()) longest = p1; string p2 = expandAroundCenter(s, i, i+1); if (p2.length() > longest.length()) longest = p2; } return longest; }
时间复杂度为O(n)的算法
http://leetcode.com/2011/11/longest-palindromic-substring-part-ii.html
相关文章推荐
- LeetCode 5. Longest Palindromic Substring
- LeetCode解题报告—— 2 Keys Keyboard & Longest Palindromic Substring & ZigZag Conversion
- [leetcode] 5-Longest Palindromic Substring
- LeetCode 5 - Longest Palindromic Substring
- [Leetcode]Longest Palindromic Substring
- [LeetCode]Longest Palindromic Substring@python
- [leetcode]5. Longest Palindromic Substring
- [LeetCode][JavaScript]Longest Palindromic Substring
- 【一天一道LeetCode】#5 Longest Palindromic Substring
- [leetcode 5]longest palindromic substring
- leetcode 第五题 Longest Palindromic Substring
- [LeetCode] Longest Palindromic Substring - O(n)
- LeetCode 5 Longest Palindromic Substring
- leetcode-Longest Palindromic Substring
- LeetCode 5. Longest Palindromic Substring(C++)
- Leetcode--Longest Palindromic Substring(最长回文子序列)
- leetcode 第五题 Longest Palindromic Substring (java)
- [LeetCode] Longest Palindromic Substring 最长回文串
- LeetCode – Refresh – Longest Palindromic Substring
- [LeetCode]Longest Palindromic Substring