hdu4847 Wow! Such Doge! KMP基础题

题目大意:给你许多个字符串看一共有多少个"doge"。延用了hdoj一贯的“好长一段题目百分之九十九是废话”的取题风格

kmp基础题,先把输入的字符串str里的字母变成小写(for…tolower(str[i])),然后和doge对比,看里面有多少个doge。

#include<iostream>
#include<string>
using namespace std;
#define maxn 100
int nextt[maxn];
int ans=0;
void cal_next(string ptr)
{
 int k=-1;
 nextt[0]=-1;
 for(int i=1;i<ptr.size();i++)
 {
  while(k>-1&&ptr[i]!=ptr[k+1])
  {
   k=nextt[k];
  }
  if(ptr[k+1]==ptr[i])
   k++;
  nextt[i]=k;
 }
}
void kmp(string str,string ptr)
{
 int k=-1;
 for(int i=0;i<str.size();i++)
 {
  while(k!=-1&&str[i]!=ptr[k+1])
  {
   k=nextt[k];
  }
  if(str[i]==ptr[k+1])
  {
   k++;
  }
  if(k==ptr.size()-1)
  {
   ans++;
   k=-1;//记住一个字符串可能有好多个doge,要把k调回-1
  }
 }
}
int main()
{
 string str;
 string ptr="doge";
 cal_next(ptr);
 while(cin>>str)
 {
  for(int i=0;i<str.size();i++)
  {
   if(isalpha(str[i]))
   {
   str[i]=tolower(str[i]);
   }
  }
  kmp(str,ptr);
 }
 cout<<ans<<endl;
}
发布了16 篇原创文章 · 获赞 1 · 访问量 266

猜你喜欢

转载自blog.csdn.net/weixin_44254608/article/details/104686703