标签:
字符串处理的题可能有一些可以直接用到STL里面的函数,会很快很方便,比如cstring里面的strncpy和strstr:
char*strncpy(char*dest,char*src,size_tn):
为字符串拼接函数,把src字符串的起始地址加上size长度(偏移量),copy到dest数组里面;
extern
char
*
strstr
(
char
*str1,
const
char
*str2):
就是在str1里面查找str2,返回一个指针,指向找到的位置,找不到就返回NULL;
就直接用到了这两个函数秒掉:
先找出最短的字符串,它的长度设为len,用来枚举每个不同长度(1~len)的子串,拼接给一个空字符串,获得子串sub,然后获得reverse的子串rev;
然后遍历全部字符串,用strstr判断能否匹配sub和rev!!!
1 // poj 1226.Substrings 2 // strstr + strncpy 3 // references: 4 // http://blog.sina.com.cn/s/blog_691ce2b70101mapk.html 5 #include <iostream> 6 #include <cstdio> 7 #include <cstring> 8 #include <algorithm> 9 10 using namespace std; 11 12 const int N = 105; 13 char s[N][N]; 14 char sub[N]; 15 char rev[N]; 16 17 int main() 18 { 19 int t; 20 scanf("%d", &t); 21 while(t--) 22 { 23 int n; 24 scanf("%d", &n); 25 int len = 105; 26 int index = 0; 27 for(int i=0; i<n; i++) 28 { 29 scanf("%s", &s[i]); 30 if(len > strlen(s[i])) 31 { 32 len = strlen(s[i]); 33 index = i; 34 } 35 } 36 bool flag; 37 int i; 38 for(i=len; i>=1; i--) 39 { 40 for(int j=0; j<=len-i; j++) 41 { 42 flag = 1; 43 memset(sub, 0, sizeof(sub)); 44 memset(rev, 0, sizeof(rev)); 45 strncpy(sub, s[index]+j, i); 46 //printf("%s ", sub); 47 for(int k=0; k<i; k++) 48 rev[k] = sub[i-k-1]; 49 //printf("%s\n", rev); 50 for(int k=0; k<n; k++) 51 { 52 if(strstr(s[k], sub) == NULL && strstr(s[k], rev) == NULL) 53 { 54 flag = 0; 55 break; 56 } 57 } 58 if(flag) 59 break; 60 } 61 if(flag) 62 break; 63 } 64 printf("%d\n", i); 65 } 66 return 0; 67 }
标签:
原文地址:http://www.cnblogs.com/dominjune/p/4713709.html