poj 1226 Substrings

链接:点击打开链接

(1)函数原型:extern char *strstr(char *str1, char *str2);    功能:找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)。判断一个子串是否在一个字符串中出现
(2)原型:char *strcpy(char *dest, char *src);   功能:把src所指由'\0'结束的字符串复制到dest所指的数组中。
 ( 3) 原型:char * strncpy(char *dest, char *src, size_t n);   功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样只有遇到NULL才停止复制,而是多了一个条件停止,就是说如果复制到第n个字符还未遇到NULL,也一样停止),返回指向dest的指针。
(4) strlen(char *str) 计算c风格字符串的长度。
(5)题意解析:
  a) 这里首先从所有的字符串中找出最短的那个字符串作为源字符串。
  b) 然后按照从长到短的枚举方法一个一个的查找是否其他的字符串是否均含有该源字符串的子字符串。这里借助于库函数strstr
  c) 遍历方法,首先是整个源字符串,然后是源字符串长度减少1的所有字符串,然后是减少2的所有字符串,如果找到就跳出来输出。
(6)另外注意的是这里还要求了也可以是某个字符串的翻转字符串也可以。
 

#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
	char str1[105][105],str2[105],pos1[105],pos2[105];
	int i,j,t,n,min_len,id,flag;
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		min_len=105;
		for(i=0;i<n;i++){
			scanf("%s",str1[i]);
			if(strlen(str1[i])<min_len){
				min_len=strlen(str1[i]);
				id=i;
				}
			}
			int len;
			len=min_len;
			strcpy(str2,str1[id]);
			while(len>0){
			//	flag=0;
				for(i=0;i<=min_len-len;i++){
					flag=1;
					strncpy(pos1,str2+i,len);
					for(j=0;j<len;j++)
					pos2[j]=pos1[len-j-1];
					pos1[len]=pos2[len]='\0';
					for(j=0;j<n;j++){
						if(strstr(str1[j],pos1)==NULL&&strstr(str1[j],pos2)==NULL){
							flag=0;
							break;
							}
						}
						if(flag) break;
					}
					if(flag) break;
					len--;
				}
				printf("%d\n",len);
		}
		return 0;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值