列表

详情


KS10. 回文字符串

描述

最大回文子串是被研究得比较多的一个经典问题。最近月神想到了一个变种,对于一个字符串,如果不要求子串连续,那么一个字符串的最大回文子串的最大长度是多少呢。

数据范围:字符串长度满足 ,字符串中仅包含 0~9 和大小写字母

输入描述

每个测试用例输入一行字符串(由数字0-9,字母a-z、A-Z构成),字条串长度大于0且不大于1000.

输出描述

输出该字符串的最长回文子串的长度。(不要求输出最长回文串,并且子串不要求连续)

示例1

输入:

adbca

输出:

3

说明:

因为在本题中,不要求回文子串连续,故最长回文子串为aba(或ada、aca)

原站题解

C++ 解法, 执行用时: 3ms, 内存消耗: 484KB, 提交时间: 2019-08-09

#include<iostream>
#include<algorithm>
#include<string>
#include<math.h>
#include<stdlib.h>
#include <iostream>
#include <vector>
#include <queue>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<iostream>
#include<set>
#include<map>
using namespace std;
  
int dp[2][1500];
int main()
{
    string str;
    cin>>str;
    int len = str.length();
  
    memset(dp,0,sizeof(dp));
    int cur = 0;
    for(int i = len - 1; i >= 0; i--)
    {
        cur ^= 1;
        dp[cur][i] = 1;
        for(int j = i + 1; j < len; j++)
        {
            if(str[i] == str[j])
                dp[cur][j] = dp[cur^1][j-1] + 2;
            else
                dp[cur][j] = max(dp[cur][j-1],dp[cur^1][j]);
        }
    }
    cout<<dp[cur][len-1];
     
    return 0;
}

C++14 解法, 执行用时: 3ms, 内存消耗: 492KB, 提交时间: 2020-05-18

#include<iostream>
#include<algorithm>
#include<string>
#include<math.h>
#include<stdlib.h>
#include <iostream>
#include <vector>
#include <queue>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<iostream>
#include<set>
#include<map>
using namespace std;
 
int dp[2][1500];
int main()
{
	string str;
	cin>>str;
	int len = str.length();
 
    memset(dp,0,sizeof(dp));
    int cur = 0;
    for(int i = len - 1; i >= 0; i--)
    {
        cur ^= 1;
        dp[cur][i] = 1;
        for(int j = i + 1; j < len; j++)
        {
            if(str[i] == str[j])
                dp[cur][j] = dp[cur^1][j-1] + 2;
            else
                dp[cur][j] = max(dp[cur][j-1],dp[cur^1][j]);
        }
    }
    cout<<dp[cur][len-1];
}
 

C++ 解法, 执行用时: 3ms, 内存消耗: 500KB, 提交时间: 2020-11-17

#include<iostream>
#include<algorithm>
#include<string>
#include<math.h>
#include<stdlib.h>
#include <iostream>
#include <vector>
#include <queue>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<iostream>
#include<set>
#include<map>
using namespace std;
   
int dp[2][1500];
int main()
{
    string str;
    cin>>str;
    int len = str.length();
   
    memset(dp,0,sizeof(dp));
    int cur = 0;
    for(int i = len - 1; i >= 0; i--)
    {
        cur ^= 1;
        dp[cur][i] = 1;
        for(int j = i + 1; j < len; j++)
        {
            if(str[i] == str[j])
                dp[cur][j] = dp[cur^1][j-1] + 2;
            else
                dp[cur][j] = max(dp[cur][j-1],dp[cur^1][j]);
        }
    }
    cout<<dp[cur][len-1];
      
    return 0;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 504KB, 提交时间: 2020-07-28

#include<iostream>
#include<algorithm>
#include<string>
#include<math.h>
#include<stdlib.h>
#include <iostream>
#include <vector>
#include <queue>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<iostream>
#include<set>
#include<map>
using namespace std;
   
int dp[2][1500];
int main()
{
    string str;
    cin>>str;
    int len = str.length();
   
    memset(dp,0,sizeof(dp));
    int cur = 0;
    for(int i = len - 1; i >= 0; i--)
    {
        cur ^= 1;
        dp[cur][i] = 1;
        for(int j = i + 1; j < len; j++)
        {
            if(str[i] == str[j])
                dp[cur][j] = dp[cur^1][j-1] + 2;
            else
                dp[cur][j] = max(dp[cur][j-1],dp[cur^1][j]);
        }
    }
    cout<<dp[cur][len-1];
      
    return 0;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 608KB, 提交时间: 2020-04-23

#include<iostream>
#include<algorithm>
#include<string>
#include<math.h>
#include<stdlib.h>
#include <iostream>
#include <vector>
#include <queue>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<iostream>
#include<set>
#include<map>
using namespace std;
 
int dp[2][1500];
int main()
{
 string str;
 cin>>str;
 int len = str.length();
 
  memset(dp,0,sizeof(dp));
  int cur = 0;
  for(int i = len - 1; i >= 0; i--)
  {
    cur ^= 1;
    dp[cur][i] = 1;
    for(int j = i + 1; j < len; j++)
    {
      if(str[i] == str[j])
        dp[cur][j] = dp[cur^1][j-1] + 2;
      else
        dp[cur][j] = max(dp[cur][j-1],dp[cur^1][j]);
    }
  }
  cout<<dp[cur][len-1];
}

上一题