C程序计算模式字符串

时间:2015-08-13 15:19:33

标签: c string

给定源字符串S和模式字符串P,计算模式字符串P在源字符串S中出现的次数。

输入格式: 第一行是源字符串S s.t. 1< = | S | < = 8192个字符 第二行是模式字符串P s.t. 1< = | P | < = 8192个字符

输出格式: 输出一个整数,其中包含源字符串S中模式字符串P的出现次数。

这段代码有什么不对?

#include<stdio.h>
int main()
{
 int i=0,j=0,k=0,loss=0,noss=0;
 char ms[8192],ss[8192];
 scanf("%s",&ms);
 scanf("%s",&ss);
 while(ss[loss]!='\0')
  {
    loss=loss+1;

      }
     while(ms[i]!='\0')
      {
       j=0;
       if(ms[i]==ss[0])
        {
          j=j+1;
          k=i+1;
          while(ss[j]!='\0')
           {
             if(ms[k]==ss[j])
                j++;
             else
                break;
           }
          if(j==loss-1)noss++;
        }
       i++;
      }
      printf("%d",noss);
      return(0);

     }

测试案例1

输入:密西西比州           ISSI

预期输出:2

实际输出:2

测试案例2

输入:ouagadougou          欧

预期输出:3

实际输出:0

2 个答案:

答案 0 :(得分:1)

顺便说一下,只是为了回答这个问题。请参阅第25-28行和第32行中的差异。

 18        if(ms[i]==ss[0])
 19         {
 20           j=j+1;
 21           k=i+1;
 22           while(ss[j]!='\0')
 23            {
 24              if(ms[k]==ss[j])
 25 {
 26                 j++;
 27 k++;
 28 }
 29              else
 30                 break;
 31            }
 32 if(j==loss)noss++;
 33         }

答案 1 :(得分:0)

int PatternCount2(string s)
{
    int result = 0;
    bool mark = false;
    bool inword = false;
    
    for(char c: s) {
        if(c == '1') {
            if(mark && inword) {
                // found pattren
                result++;
                // reset inword
                inword = false;
            }
            mark = true;
        }
 
       if(c == '0' && mark){   
            inword = true;
        }
    }
    
    return result;
}