52.计算子字符串个数(更新测试)
字符串匹配问题:输入一个字符串,计算其中包含的连续给定的子字符串的个数(只记录最多)。
例如输入字符串" EFABCABCABCDABCDD ” , 给定子字符串" ABC” ,输出是 3。
函数原型: int countsub( char *str, char *subs ) 。
参数说明: str 保存输入的字符串的首地址, subs 保存需要统计的子字符串的首地址。
返回值:包含的连续子字符串的个数。
说明:请仅提交你编写的函数 countsub( char *str, char *subs )。
预设代码
countsub_H20.c
view plainprint?/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */
#include <stdio.h>
int countsub( char *str, char *ss );
main( )
{
char s1[1000] = {0}, s2[100] = {0};
gets(s1);
gets(s2);
printf("%d\n", countsub( s1, s2 ) );
}
/* PRESET CODE END - NEVER TOUCH CODE ABOVE */
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
|
以文本方式显示
|
1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
|
以文本方式显示
|
1秒 | 64M | 0 |
测试用例 6 | 以文本方式显示
|
以文本方式显示
|
1秒 | 64M | 0 |
测试用例 7 | 以文本方式显示
|
以文本方式显示
|
1秒 | 64M | 0 |
测试用例 8 | 以文本方式显示
|
以文本方式显示
|
1秒 | 64M | 0 |
【分析】:
这题真的无力吐槽。首先是它给的代码,这个main着实让我愣住了,反应了一段时间后才意识到如果是返回值是int 类型,可以省略(因为编译器会帮你补上),但是这个实在是让人不吐不快,正常人这么写代码是要被骂的。
难点主要是在于连续性的判断
【代码】
/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */
#include <stdio.h>
int countsub(char* str, char* ss);
int main()
{
char s1[1000] = { 0 }, s2[100] = { 0 };
gets(s1);
gets(s2);
printf("%d\n", countsub(s1, s2));
}
/* PRESET CODE END - NEVER TOUCH CODE ABOVE */
int countsub(char* str, char* ss)
{
/*难点主要是在于连续*/
int count=0,t=0;
for (int i = 0; *(str + i) != '\0'; i++,t=0) {
if (*(str + i) == ss[0]) {
R:int j;
for (j = 1; *(ss + j) != '\0' && *(str + i + j) == *(ss + j); j++);
if (*(ss + j) == '\0') {
t++;
i += j;
if (*(str + i) == ss[0] && *(str + i + 1) == ss[1]) goto R;
}
}
count = count > t ? count : t;
}
return count;
}
不过我使用了goto语句,这个可能会引发争议,所以接下来把它给换掉
/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */
#include <stdio.h>
int countsub(char* str, char* ss);
int main()
{
char s1[1000] = { 0 }, s2[100] = { 0 };
gets(s1);
gets(s2);
printf("%d\n", countsub(s1, s2));
}
/* PRESET CODE END - NEVER TOUCH CODE ABOVE */
int countsub(char* str, char* ss)
{
/*难点主要是在于连续*/
int count=0,t=0;
int flag = 0;
for (int i = 0; *(str + i) != '\0'; i++,t=0) {
if (*(str + i) == ss[0]) {
do {
int j; flag = 0;
for (j = 1; *(ss + j) != '\0' && *(str + i + j) == *(ss + j); j++);
if (*(ss + j) == '\0') {
t++;
i += j;
if (*(str + i) == ss[0] && *(str + i + 1) == ss[1]) flag=1;
}
} while (flag);
}
count = count > t ? count : t;
}
return count;
}
标签:CODE,ss,countsub,个数,52,char,int,str,字符串 From: https://www.cnblogs.com/alien-han/p/16999947.html