1.最长回文字符串

  1. 有很多关于这方面的知识,比如说是:动态规划之类的,但是不好理解。今天我想了想,觉得其实写这一题大可不必这么麻烦,两个for循环即可搞定,时间复杂度不过是O(n^2);还可以接受。
  2. 思路如下
    • 因为求最长回文字符串,即该字符串一定是对称的,用一个for循环遍历字符串的每一位,这样再去检查以这每一位得到的回文字符串长度,最后取其最长即可。
    • 需要注意两点:1)回文字符串可能是奇数位,比如题中测试用例:Is PAT&TAP symmetric?中的s PAT&TAP s就是11位;2)回文字符串可能是偶数位:ABCDDCBA。所以第一次找奇数位的回文字符串,第二次找偶数位的回文字符串,取两者较大者即可。
  3. 代码如下
#include<cstdio>
#include<string>
#define maxn 1002
#include<iostream>
using namespace std;

int main(){
    int i,j,k;
    string str;//字符串 
    getline(cin,str);
    int longCom = 1;//最长公共字符串的长度 
    int len = str.length();
    int tempLen;
    //奇位数对称 
    for(i = 1;i< len;i++){
        j = i;
        k = i;
        tempLen = 1;
        while(str[k-1] == str[j+1] && j < len - 1 && k > 0){
            k--;
            j++;
            tempLen+=2;
        }
        if(tempLen > longCom){
            longCom = tempLen;
        }
    }
    //偶位数对称 
    for(i = 0;i< len;i++){
        j = i + 1;//高位 
        k = i;//低位 
        tempLen = 0;
        while(str[k] == str[j] && j < len  && k >= 0){
            k--;
            j++;
            tempLen+=2;
        }
        if(tempLen > longCom){
            longCom = tempLen;
        }
    }

    printf("%d",longCom);
}
/*
ABCDDCBA
ASDFA
AFDFAFDFA
s? PAT&TAP ?
**/