5. Longest Palindromic Substring

Question

LeetCode Problem

Given a string s, return the longest palindromic substring in s.

Constraints


Solutions

O(N^2) method

string longestPalindrome(string s) {
	int m = s.size();
	if (m < 2) return s;
	int bestLen = 1;
	int bestStart = 0;
	auto expand = [&](int left, int right) {
		while (left >= 0 && right < m && s[left] == s[right]) {
			--left;
			++right;
		}
		// now s[left+1] ~ s[right-1] is the palidrome string
		int distance = right - left - 1;
		int start = left + 1;
		if (distance > maxLen) {
			maxLen = distance;
			bestStart = start;
		}
	};
	for (int i = 0; i < m; ++i) {
		expand(i, i);
		expand(i , i + 1);
	}
	return s.substr(bestStart, bestLen);
}

Use DP

string longestPalindrome(string s) {
	int m = static_cast<int>(s.size());
	if (m == 0) return s;
	vector<vector<bool>> dp(m, vector<bool>(m, false));
	int maxLen = 1;
	int bestStart = 0;
	for (int i = (m-1); i >= 0; i--) {
		for (int j = i, j < m; j++) {
			if (s[i] == s[j]) {
				if (j - i <= 1) {
					dp[i][j] = true;
				} else if (dp[i+1][j-1]) {
					dp[i][j] = true;
				}
			}
			if (dp[i][j]) {
				int distance = j - i + 1;
				if (distance > maxLen) {
					maxLen = distance;
					bestStart = i;
				}
			}
		}
	}
	return s.substr(bestStart, maxLen);
}