ACM:密码截获

问题:http://acm.zjut.edu.cn/(F(sjjtWtH02bLVHyNslt5NKayi1Agu4bdzxMKfSTGyIo8gb8qls2-vwcbxwSM24NX1Rodj2i5ju0a-foYfpCbGs3nmEOmZolw-T_BIg1eYiVO851VucMUUbc_qkB7ZkdpV2gtSu6On6HL0zSB7EJF0iqw0RaCIJU14D46bB3t5NFMMfkgA0))/ShowProblem.aspx?ShowID=1001

Description:

Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如ABBA,ABA,A,123321等,但是他们有时会在开始或结束时加入一些无关的字符以防别国破解。比如进行下列变化ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?

Input:

测试数据有若干行字符串,包括字母(字母区分大小写),数字,符号。   

Output:

与输入相对应每一行输出一个整数,代表最长有效密码串的长度。   

Sample Input:

ABBA
12ABBA
A
ABAKK
51233214
abaaab

Sample Output:

4
4
1
3
6
5

Source:

Jin Qiwei

基本想法:

按顺序截取所有子串,然后判断是否为回文,是的话把该子串的长度记录下来,然后最后结果输出长度最长的子串的长度

参考代码:

#include<iostream>
#include<string>
using namespace std;
bool isPalindromeString(string str)//判断是否是回文
{
    //bool isPal = true;
    int index1 = 0;
    int index2 = str.length() - 1;

    while(index1 < index2)
    {
        if(str[index1] != str[index2])
            return false;    
        index1++;
        index2--;
    }
    return true;
}
void main()
{
    string source,substring;
    int maxLength;
    int length;
    int i,j;
    while(cin>>source)
    {
        for(i=0 ; i<source.length() ; i++)
        {
            length = source.length() - i;
            for(j=i ; j<length ; j++)
            {
                substring = source.substr(i,j+1);//截取子串
                if(isPalindromeString(substring))
                    maxLength = (maxLength>j+1)?maxLength:j+1;
            }
        }
        cout<<maxLength<<endl;
        maxLength = 0;
    }
}

结果截图:

 刚开始时并不知道什么时候停止输入,即没有输入停止的标记,到网上找:http://www.cnblogs.com/DpmiSystem/archive/2010/09/16/1827959.html

 知道了无需判断什么时候结束

原文地址:https://www.cnblogs.com/KeenLeung/p/2949145.html