1040 Longest Symmetric String (25 分)(字符串处理)

1040 Longest Symmetric String (25 分)

Given a string, you are supposed to output the length of the longest symmetric sub-string. For example, given Is PAT&TAP symmetric?, the longest symmetric sub-string is s PAT&TAP s, hence you must output 11.

Input Specification:

Each input file contains one test case which gives a non-empty string of length no more than 1000.

Output Specification:

For each test case, simply print the maximum length in a line.

Sample Input:

Is PAT&TAP symmetric?

Sample Output:

11

本题大意

输入一个字符串,求该字符串中最长对称子串的长度。

分析

Update: 2020/2/6 18:16, 经网友超大拇指提醒,现判断条件更改(原来错误由于substr参数第二个参数理解有误导致)。另外新增解法二。
本题考查字符串处理的知识,掌握string的一些常用函数(e.g. substr,获取字符串子串)解此题不难。解法一采用Brute Force方法。解法二利用动态规划解题,dp[i][j]表示子串i->j是否是回文,因此动态方程为dp[i][j] = s[i] == s[j] && dp[i + 1][j - 1].

解法1:
 #include 
 #include 
 using namespace std;
 int main(){
    string s;
    int maxlen = 0;
    getline(cin, s);
    for(int i = 0; i < s.size(); i++){
        for(int j = 1; j <= s.size() - i; j++){
            string s1 = s.substr(i,j), s2 = s1;
            reverse(s2.begin(), s2.end());
            if(s2 == s1 && maxlen < s1.size()) maxlen = s1.size();
        }
    }
    printf("%d",maxlen);
    return 0;
 }}
解法2:
 #include 
 #include 
 using namespace std;
 int main(){
    string s;
    getline(cin, s);
    int n = s.size(), res = 1;
    vector<vector<bool>> dp(n, vector<bool>(n, false));
    for (int i = 0; i < n; ++i) {
    	dp[i][i] = true;
    	if (i <= n - 2 && s[i] == s[i + 1]) {
    		dp[i][i + 1] = true;
    		res = 2;
		}
	}
    for (int len = 3; len <= n; ++len) {
    	for (int i = 0; i <= n - len; ++i) {
    		int j = i + len - 1;
    		if (s[i] == s[j] && dp[i + 1][j - 1]) {
    			dp[i][j] = true;
    			res = len;
			}
		}
	}
    printf("%d", res);
    return 0;
 }

你可能感兴趣的:(PAT,甲级)