• 浙大pat1040 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


    题目思路:这个题实质是求最长回文子串的长度。
    有两种思路,第一种是以中间元素为中心,向两边扩散,这种写法及其好写,但是麻烦的是遇到abba这种偶数个回文串的情况就不知道怎么办了。在网上找到了一个神奇的方法,就是往每个字符串两边添加一个字符,之后再将总数除以2即可
    这是该思路的链接https://blog.csdn.net/sunbaigui/article/details/8656933
    贴一下我写的代码:
    #include <iostream>
    #include <string>
    using namespace std;
    int main(int argc, char *argv[]) {
    	string so;
    	getline(cin,so);
    	int length = so.length();
    	string s;
    	for(int i=0;i<length;i++)
    	{
    		s.push_back('-');
    		s.push_back(so[i]);
    	}
    	s.push_back('-');
    	
    	int max = -1;
    	for(int i=1;i<s.length()-1;i++)
    	{
    		int tmp_length=1;
    		int p,q;
    		p = i-1;
    		q = i+1;
    		while (s[p] == s[q]) 
    		{
    			p--;
    			q++;
    			tmp_length+=2;
    			if(p<0||q>s.length())
    			break;
    		}
    		if(max<tmp_length)
    			max = tmp_length;
    	}
    	cout<<max/2;
    }
    

      第二种思路就是把串翻转过来,转化成求两个串最大子序列的问题(一般都有板子的)这里借鉴了(https://blog.csdn.net/zhangpiu/article/details/50733603)

    #include <iostream>
    #include <cstdio>
    #include <vector>
    #include <algorithm>
     
    using namespace std;
     
    string maxSubString(string s1, string s2){
    	int xlen = (int)s1.size(), ylen = (int)s2.size();
    	vector<vector<int>> m(xlen, vector<int>(ylen, 0));
    	int maxlen = -1, index = -1;
     
    	for(int i = 0; i < xlen; ++i){
    		for(int j = 0; j < ylen; ++j){
    			if(s1[i] == s2[j]){
    				if(i == 0 || j == 0) m[i][j] = 1;
    				else m[i][j] = m[i-1][j-1] + 1;
     
    				if(maxlen < m[i][j]){
    					maxlen = m[i][j];
    					index = i - maxlen + 1;
    				}
    			}
    		}
    	}
     
    	return s1.substr(index, maxlen);
    }
     
    int main(){
    	string s;
    	getline(cin, s);
     
    	string rs(s);
    	reverse(begin(rs), end(rs));
     
    	cout << maxSubString(s, rs).size();
     
    	return 0;
    

      

  • 相关阅读:
    ORACLE游标概念讲解
    [转载]Oracle如何查看日志
    oracle 游标以及游标变量
    Oracle游标大全
    [转载]Oracle如何查看日志
    追踪从指缝溜走的时间
    《Falcon 初印象》幻灯分享
    百姓网那道题
    一个JavaScript写的黑白棋AI
    trac 推广 ppt 分享
  • 原文地址:https://www.cnblogs.com/SK1997/p/9588868.html
Copyright © 2020-2023  润新知