pat 1040
原创
©著作权归作者所有:来自51CTO博客作者说文科技的原创作品,请联系作者获取转载授权,否则将追究法律责任
1.最长回文字符串
- 有很多关于这方面的知识,比如说是:动态规划之类的,但是不好理解。今天我想了想,觉得其实写这一题大可不必这么麻烦,两个for循环即可搞定,时间复杂度不过是O(n^2);还可以接受。
- 思路如下
- 因为求最长回文字符串,即该字符串一定是对称的,用一个for循环遍历字符串的每一位,这样再去检查以这每一位得到的回文字符串长度,最后取其最长即可。
- 需要注意两点:1)回文字符串可能是奇数位,比如题中测试用例:Is PAT&TAP symmetric?中的s PAT&TAP s就是11位;2)回文字符串可能是偶数位:ABCDDCBA。所以第一次找奇数位的回文字符串,第二次找偶数位的回文字符串,取两者较大者即可。
- 代码如下
#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 ?
**/