依然是最长回文子串 9OJ-1528

来源:互联网 发布:比较可靠的网络兼职 编辑:程序博客网 时间:2024/06/05 17:46

1528编号的9oj,回文问题。这个题用比较好的动态规划法的话会出现内存溢出,因为输入的字符串长度太长了。表示状态量的二维数组存不下。

换成最直观的办法反倒AC了。就是:依次以每一个字符为回文中心往两端扩大判断,依次以两个相同的字符为中心往两端扩大判断。

#include <stdio.h>#include <malloc.h>#include <string.h>#define N 200000int LongestPalindrome(char* a){if(a==NULL)return 0;int len = strlen(a);int max=1;int left, right;for(int i=1;i<len;i++){left = i-1;right = i+1;while(left>=0 && right<len){if(a[left] == a[right]){if (right - left + 1 > max)max = right - left + 1;left--;right++;}elsebreak;}if(a[i-1]==a[i]){left = i-1;right = i;while(left>=0 && right<len){if(a[left] == a[right]){if (right - left + 1 > max)max = right - left + 1;left--;right++;}elsebreak;}}}return max;}int main(){char a[N];int result;while(scanf("%s",a)!=EOF){result = LongestPalindrome(a);printf("%d\n", result);}return 1;}


同样的方法,数据类型改成了string类型,AC了leetcode的《Longest Palindromic Substring》。

#include <cstdio>#include <iostream>#include <string>using namespace std;#define N 200string LongestPalindrome(string s){if(s == "")return 0;int len = s.length();int max=1, max_left=0, max_right=0;int left, right;for(int i=1;i<len;i++){left = i-1;right = i+1;while(left>=0 && right<len){if(s[left] == s[right]){if (right - left + 1 > max){max_left = left;max_right = right;max = right - left + 1;}left--;right++;}elsebreak;}if(s[i-1]==s[i]){left = i-1;right = i;while(left>=0 && right<len){if(s[left] == s[right]){if (right - left + 1 > max){max_right = right;max_left = left;max = right - left + 1;}left--;right++;}elsebreak;}}}string re;string tmp;for(int j=max_left; j<=max_right; j++){tmp = s[j];re.append(tmp);}return re;}int main(){string a;string result;while(cin>>a){result = LongestPalindrome(a);cout<<result<<endl;}return 1;}



注意:string类型和char*类型在长度计算、判空、定义、赋值、结尾字符、头文件上的区别!

原创粉丝点击