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 ABCABA XYZ XCVCX
- 样例输出
-
ABA X XCVCX
- 来源
解体思路:求原字符串与逆字符串的最长公共子串
代码如下:
#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; }