Longest Palindromic Substring
LeetCode OJ 5: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.
思路1:回文字符串是对称的,如果字符串长度为奇数,那么相对于最中间的字符对称。如果字符串长度为偶数,则相对于最中间的两个字符对称。利用这一特性,我们分别假设字符串的每一个字符为中间字符,并记录下回文字串的长度。最终遍历出最长的回文字符串。
class Solution { public: 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 longestPalindrome(string s) { int n = s.length(); if (n == 0) return ""; string longest = s.substr(0, 1); 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; } };
思路2:除了思路1之后,此问题可以很容易的转化为求两个字符串最长相同子串的问题。需要注意的是,某些特殊情况下,需要进行indices的判断。
int longestCommonSubstr(const string& str1, const string& str2) { size_t size1 = str1.size(); size_t size2 = str2.size(); if (size1 == 0 || size2 == 0) return 0; vector<vector<int> > table(size1, vector<int>(size2, 0)); int start1 = -1; int start2 = -1; int longest = 0; int comparisons = 0; for (int j = 0; j < size2; ++j) { ++comparisons; table[0][j] = (str1[0] == str2[j] ? 1 :0); } for (int i = 1; i < size1; ++i) { ++comparisons; table[i][0] = (str1[i] == str2[0] ? 1 :0); for (int j = 1; j < size2; ++j) { ++comparisons; if (str1[i] == str2[j]) { table[i][j] = table[i-1][j-1]+1; } } } for (int i = 0; i < size1; ++i) { for (int j = 0; j < size2; ++j) { if (longest < table[i][j]) { longest = table[i][j]; start1 = i-longest+1; start2 = j-longest+1; } } } return longest; }