nyoj308(最长公共子串)

来源:互联网 发布:一个域名对应多个网站 编辑:程序博客网 时间:2024/04/30 17:37

Substring

时间限制:1000 ms  |  内存限制:65535 KB
难度:1
描述

You are given a string input. You are to find the longest substring of input such that the reversal of the substring is also a substring of input. In case of a tie, return the string that occurs earliest in input. 

Note well: The substring and its reversal may overlap partially or completely. The entire original string is itself a valid substring . The best we can do is find a one character substring, so we implement the tie-breaker rule of taking the earliest one first.

输入
The first line of input gives a single integer, 1 ≤ N ≤ 10, the number of test cases. Then follow, for each test case, a line containing between 1 and 50 characters, inclusive. Each character of input will be an uppercase letter ('A'-'Z').
输出
Output for each test case the longest substring of input such that the reversal of the substring is also a substring of input
样例输入
3                   ABCABAXYZXCVCX
样例输出
ABAXXCVCX
来源

第四届河南省程序设计大赛


解体思路:求原字符串与逆字符串的最长公共子串


代码如下:

#include<stdio.h>#include<string.h>int c[55][55];void longest_common_substring(char *str1, char *str2){int i,j,k,len1,len2,max,x,y;len1 = strlen(str1);len2 = strlen(str2);max = -1;for(i = 0 ; i <= len1 ; i++){for(j = 0; j <= len2; j++){if(i==0||j==0){c[i][j]=0;}else if(str1[i-1]==str2[j-1])     //只需要跟左上方的c[i-1][j-1]比较就可以了c[i][j]=c[i-1][j-1]+1;else                         //不连续的时候还要跟左边的c[i][j-1]、上边的c[i-1][j]值比较,这里不需要c[i][j]=0;if(c[i][j]>max){max=c[i][j];x=i;y=j;}}}//输出公共子串char s[55];k=max;i=x-1,j=y-1;s[k--]='\0';while(i>=0 && j>=0){if(str1[i]==str2[j]){s[k--]=str1[i];i--;j--;}else       //只要有一个不相等,就说明相等的公共字符断了,不连续了break;}puts(s);}int main(){int t,i;char s[55];char rs[55];scanf("%d",&t);while(t--){scanf("%s",s);int l=strlen(s);for(i=0;i<l;i++)rs[l-1-i]=s[i];longest_common_substring(s,rs);}return 0;}               


0 0
原创粉丝点击