百炼OJ 2744 子串
来源:互联网 发布:韩版男士店铺淘宝 编辑:程序博客网 时间:2024/05/16 09:31
2744:子串
- 描述
- 现在有一些由英文字符组成的大小写敏感的字符串,你的任务是找到一个最长的字符串x,使得对于已经给出的字符串中的任意一个y,x或者是y的子串,或者x中的字符反序之后得到的新字符串是y的子串。
- 输入
- 输入的第一行是一个整数t (1 <= t <= 10),t表示测试数据的数目。对于每一组测试数据,第一行是一个整数n (1 <= n <= 100),表示已经给出n个字符串。接下来n行,每行给出一个长度在1和100之间的字符串。
- 输出
- 对于每一组测试数据,输出一行,给出题目中要求的字符串x的长度。
- 样例输入
23ABCDBCDFFBRCD2roseorchid
- 样例输出
22
解题报告:
数据量很小直接暴力就可以过了,然后写了两种代码,一样的思路。
代码1:
#include <stdio.h>#include <string.h>char str[101][101];char substr[101];int findSubStr(int k){ int i, j, klen, cnt = 0, sublen; klen = strlen(str[k]); sublen = strlen(substr); //正向 for (i = 0; i <= klen - sublen; i ++) { cnt = 0; if (str[k][i] == substr[cnt]) { cnt ++; for (j = i + 1; j < klen; j ++) { if (str[k][j] != substr[cnt]) break; cnt ++; } if (cnt == sublen) return 1; } } //反向 for (i = klen - 1; i >= sublen - 1; i --) { cnt = 0; if (str[k][i] == substr[cnt]) { cnt ++; for (j = i - 1; j >= 0; j --) { if (str[k][j] != substr[cnt]) break; cnt ++; } if (cnt == sublen) return 1; } } return 0;}int main(){ int n, i, j, k, slen, t; scanf("%d", &t); while (t --) { scanf("%d", &n); for (i = 0; i < n; i ++) scanf("%s", str[i]); slen = strlen(str[0]); int flag = 0; while (i > 0) { for (i = slen - 1; i >= 0; i --) //子串长度-1 { for (j = 0; j < slen - i; j ++) //子串起点 { strcpy(substr, str[0] + j); substr[i+1] = '\0'; for (k = 1; k < n; k ++) if (!findSubStr(k)) break; if (k == n) { printf("%d\n", strlen(substr)); flag = 1; break; } } if(flag) break; } if(flag) break; } if(flag == 0) printf("0\n"); } return 0;}
代码2:
#include <iostream>#include <string>#include <algorithm>using namespace std;string str[101];string sub;int main(){ int n, i, j, k, slen, t; cin >> t; while (t --) { cin >> n; for (i = 0; i < n; i ++) cin >> str[i]; slen = str[0].size(); int flag = 0; while (i > 0) { for (i = slen - 1; i >= 0; i --) //子串长度-1 { for (j = 0; j < slen - i; j ++) //子串起点 { sub = str[0].substr(j, i+1); for (k = 1; k < n; k ++) if (str[k].find(sub) == string::npos) { reverse(str[k].begin(), str[k].end()); if(str[k].find(sub) == string::npos) break; } if (k == n) { cout << sub.size() << endl;; flag = 1; break; } } if(flag) break; } if(flag) break; } if(flag == 0) cout << "0\n"; } return 0;}
0 0
- 百炼OJ 2744 子串
- poj百炼 2744:子串
- OpenJudge百炼-2744-子串-C语言-字符串处理
- 百炼OJ 2801:填词
- 2706:麦森数 百炼oj
- 百炼OJ:2801:填词
- 百炼OJ 1657:Distance on Chessboard
- 百炼OJ 1017:装箱问题
- 百炼OJ 2972:确定进制
- 百炼OJ 2973:Skew数
- 百炼OJ 2742:统计字符数
- 1017:装箱问题 百炼oj
- 百炼OJ:4146:数字方格
- 2811:熄灯问题 百炼oj
- POJ 百炼 保研机试 4022:买房子
- POJ百炼-2806-公共子序列
- FAFU OJ 子串
- oj 回文子串
- 【IOS动画】UIView翻转
- eclipse快捷键的使用
- 使用Javascript 实现 分享到 新浪微博 QQ 空间等
- ubuntu常用操作
- VLC 源代码结构
- 百炼OJ 2744 子串
- asp.net获取当前页面的url地址
- 三维旋转矩阵使用算法
- 大学问
- 含E的科学计数法格式转换问题
- servlet filter详解
- iOS开发之32bit转64bit需要注意的地方
- Dbgprint
- 6. GCD Block