首页 > 技术文章 > C语言-字符串

xiaojingang 2014-05-29 00:54 原文

问题:

给出的区分大小写的字母字符的字符串,找到最大的字符串X,或者为X,或者其逆可以找到任何给定的字符串的子串

输入:

输入文件的第一行包含一个整数t(1 < = t < = 10),测试用例的数量,其次是每个测试用例的输入数据。每个测试用例的第一行包含一个整数(1 < = n < = 100),给定字符串的数量,其次是n行,每个代表一个字符串的最小长度1和最大长度100。之前和之后没有额外的空白字符串。

输出:

每个测试用例应该有一行包含发现的最大字符串的长度

样例输入:

2
3
ABCD
BCDFF
BRCD
2
rose
orchid

样例输出:

2
2

解题代码中用到的处理字符串函数:

strcpy: 
char * strcpy(char * strDest,const char * strSrc);
就是将后面的数组赋给前面。如果前面数组长度不够大,运行崩溃。
 
strncpy:
char*strncpy(char*dest,char*src,size_tnum);
这个与strcpy差别在于,它可以控制长度,当然这两者都可以通过控制 第二个数组的头位置来控制赋值起点。
 
strlen:
extern unsigned int strlen(char *s);
这个就是返回s数组长度(不包括'\0')
 
strstr:
extern char *strstr(const char *str1, const char *str2);
这个函数就是查找str2在str1中的位置,若不存在返回NULL。
 
 1 #include<stdio.h>
 2 #include<string.h>
 3 char str[101][101];
 4 int sum1;//每组测试数据中的字符串个数
 5 int find_sub(int len,int index)
 6 {
 7     char s[101],pos[101],rev[101];
 8     int length;
 9     int i,j;
10     int flag;
11     strcpy(s,str[index]);
12     length=len;
13     while(length>0)
14     {
15         flag=0;
16         for(i=0;i<=len-length;i++)
17         {
18             flag=1;
19             //得到正向的字符子串
20             strncpy(pos,s+i,length);
21             //得到逆向的字符子串
22             for(j=0;j<length;j++)
23             {
24                 rev[j]=pos[length-j-1];
25             }
26             //末尾加上结束符
27             pos[length]=rev[length]='\0';
28             //判断改组的所有字符串中是否有相应的子串
29             for(i=0;i<sum1;i++)
30             {
31                 if(strstr(str[i],pos)==NULL&&strstr(str[i],rev)==NULL)
32                 {
33                     flag=0;
34                     break;
35                 }
36             }
37             if(flag)break;
38         }
39         if(flag)
40             break;
41         else
42             --length;
43     }
44     return length;
45 }
46 int main()
47 {
48     int sum;//测试的数据数量
49     int len_min;
50     int i;
51     int index;//记录最短子串的位置
52     scanf("%d",&sum);
53     while(sum--)
54     {
55         scanf("%d",&sum1);
56         len_min=101;
57         for(i=0;i<sum1;i++)
58         {
59             scanf("%s",str[i]);
60             //找到最短的字符串
61             if(strlen(str[i])<(len_min))
62             {
63                 len_min=strlen(str[i]);
64                 index=i;
65             }
66         }
67         printf("%d\n",find_sub(len_min,index));
68     }
69     return 0;
70 }

运行结果:

 

推荐阅读