首页 > 其他分享 >52.计算子字符串个数

52.计算子字符串个数

时间:2022-12-23 08:44:15浏览次数:56  
标签:CODE ss countsub 个数 52 char int str 字符串

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. EFABCABCABCDABCDD↵
  2. ABC↵
以文本方式显示
  1. 3↵
1秒 64M 0
测试用例 2 以文本方式显示
  1. abcdefghi↵
  2. xyz↵
以文本方式显示
  1. 0↵
1秒 64M 0
测试用例 6 以文本方式显示
  1. abcabdaaabaaaaaba↵
  2. aba↵
以文本方式显示
  1. 1↵
1秒 64M 0
测试用例 7 以文本方式显示
  1. aaaab↵
  2. aaab↵
以文本方式显示
  1. 1↵
1秒 64M 0
测试用例 8 以文本方式显示
  1. aaaabdaaabaaab↵
  2. aaab↵
以文本方式显示
  1. 2↵
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

相关文章