原题题目
代码实现(首刷自解)
char * longestPalindrome(char * s){
int strl = strlen(s),i,end,start,startpos = 0,endpos,max = -1;
char dp[1001][1001];
memset(dp,0,sizeof(dp));
for(end = 0;end<strl;end++)
{
for(start = end;start>=0;start--)
{
if(s[start] == s[end])
{
if(end <= start + 2 || end > start + 2 && dp[start+1][end-1] == '1')
{
dp[start][end] = '1';
if(end - start > max)
{
max = end - start;
endpos = end;
startpos = start;
}
}
}
}
}
s[endpos+1] = NULL;
return s+startpos;
}
代码实现(二刷自解 DAY 98 C++)
class Solution {
public:
string longestPalindrome(string s) {
int size = s.size(),ret = -1,pos = 0;
vector<vector<char>> dp(size,vector<char>(size,'0'));
for(int end=0;end<size;++end)
{
for(int start=end;start>=0;--start)
{
if(s[start] != s[end]) continue;
if(end <= start+2 || dp[start+1][end-1] == '1')
{
dp[start][end] = '1';
if(end-start+1 >= ret) pos = start;
ret = max(ret,end-start+1);
}
}
}
return s.substr(pos,ret);
}
};
代码实现(三刷自解 C++ DAY 164)
class Solution {
public:
string longestPalindrome(string s) {
vector<vector<bool>> dp(s.size(),vector<bool>(s.size(),false));
string ret;
for(int end=0;end<s.size();++end)
{
for(int start=end;start>=0;--start)
{
if(s[end] == s[start] && (end <= start+1 || dp[start+1][end-1]))
{
dp[start][end] = true;
if(ret.empty() || end-start+1 > ret.size())
ret = s.substr(start,end-start+1);
}
}
}
return ret;
}
};
代码实现(四刷自解 C++ DAY 200)
class Solution {
public:
string longestPalindrome(string s) {
int ret = 0,left = -1,right = -1;
vector<vector<bool>> dp(s.size(),vector<bool>(s.size(),false));
for(int end = 0;end < s.size();++end)
{
for(int start = end;start >= 0;--start)
{
if(s[start] == s[end] && (end <= start + 1 || dp[start+1][end-1]))
{
dp[start][end] = true;
if(ret < end-start+1)
{
ret = end - start + 1;
left = start;
}
}
}
}
return s.substr(left,ret);
}
};
代码实现(五刷自解 DAY 271 C++)
class Solution {
public:
string longestPalindrome(string s) {
int size = s.size();
vector<vector<int>> dp(size, vector<int>(size,0));
int left = 0, right = 0, len = 0;
for (int end = 0; end < size; ++end) {
for (int start = end; start >= 0; --start) {
if (s[start] == s[end] && (end <= start + 1 || dp[start + 1][end - 1])) {
dp[start][end] = true;
if (end - start + 1 > len) {
len = end - start + 1;
left = start;
right = end;
}
}
}
}
return s.substr(left,len);
}
};
代码实现(六刷自解 DAY 2 Golang)
func max(x, y int) int {
if x >= y {
return x
} else {
return y
}
}
func longestPalindrome(s string) string {
retlen, retleft := 0, 0
dp := make([][]bool, len(s))
for i := range dp {
dp[i] = make([]bool, len(s))
}
for end := 0; end < len(s); end++ {
for start := end; start >= 0; start-- {
if start + 1 >= end {
dp[start][end] = s[start] == s[end]
} else {
dp[start][end] = s[start] == s[end] && dp[start + 1][end - 1]
}
if dp[start][end] == true && end - start + 1 > retlen {
retlen, retleft = max(retlen, end - start + 1), start
}
}
}
return s[retleft: retleft + retlen]
}