• 斐波那契字符串_KMP


    前言:通过这道题恶补了一下字符串匹配的知识

     思路:首先就是求出菲波那切字符串,这个很简单,但是要注意递归超时的问题,可以考虑加上备忘录,或者用递推法,接下来就是匹配问题了,常规的BF会超时,所以要用KMP,

    下面的代码综合了这两种方法,就当做是一个复习,。。

      1 #include<bits/stdc++.h>
      2 
      3 using namespace std;
      4 string a[3000];
      5 string array[3000];
      6 int num[3000];
      7 int num1[3000];
      8 long long int m2=0;  
      9 int next[3000];
     10 string f(int k)//递归法加备忘录 
     11 {
     12     if(k==1) return "a";
     13     if(k==2) return "b";
     14     if(k>2) {
     15         if(a[k-1]==""){
     16             a[k-1]=f(k-1);
     17         }
     18         if(a[k-2]=="")
     19         {
     20             a[k-2]=f(k-2);
     21         }
     22         a[k] = a[k-1]+a[k-2];
     23         return a[k];
     24     }
     25 }
     26 string f1(int k)//递推法 
     27 {
     28     string a1="a";
     29        string a2="b";
     30        string a3;
     31        while(true)
     32        {
     33            a3=a2+a1;
     34            a1=a2;
     35            a2=a3;
     36            k--;
     37        //    m2=a3.length();
     38            if(k<=2) return a3;
     39     }
     40 }
     41 void BF(string str1,int stra,string str2,int strb,int k,int pos)
     42 {
     43     int i=pos;
     44     int j=0;
     45     //cout << i << strb <<"---" <<endl;
     46     while(i<stra && j<strb){
     47         if(str1[i]==str2[j]){
     48             i++;
     49             j++;
     50         }else
     51         {
     52             i=i-j+1;
     53             j=0;
     54         }
     55     }
     56     if(j>=strb){
     57         num[k]++;
     58         pos=i-strb+1;
     59         if(pos<=stra-strb){
     60             BF( str1, stra, str2, strb,k, pos);
     61         }
     62     }
     63 }
     64 void get_next(string str,int stra)
     65 {
     66     int i=1;
     67     next[1]=0;
     68     int j=0;
     69     while(i<stra){
     70         if(j==0 || str[i]==str[j]){
     71             i++;
     72             j++;
     73             next[i]=j;
     74         }else{
     75             j=next[j];
     76         }
     77     }
     78 }
     79 int KMP(string a,int stra,string b,int strb,int k,int pos)
     80 {
     81     int i=pos;
     82     int j=1;
     83     while(i<stra && j<=strb){
     84         if(j==0 || a[i]==b[j-1]){
     85             i++;
     86             j++;
     87         }else{
     88             j=next[j];
     89         }
     90     }
     91     if(j>strb){
     92         num1[k]++;
     93         pos=i-strb+1;
     94     //    cout << pos << " =pos" << endl;
     95         if(pos<=stra-strb){
     96             KMP(a,stra,b,strb,k,pos);
     97         }
     98     }
     99 }
    100 int main()
    101 {
    102     freopen("D:/Test/Test1.txt","r",stdin);
    103     a[1]="a";
    104     a[2]="b";
    105     int k,m;
    106     cin >> k >> m;
    107 
    108     memset(num,0,sizeof(num));
    109     memset(num1,0,sizeof(num1));
    110     for(int i=0;i<m;i++){
    111         cin >> array[i];
    112     }
    113     string str=f(k);
    114     cout << "------使用BF算法得到的结果-------" <<endl;
    115     for(int i=0;i<m;i++){
    116         BF(str,str.length(),array[i],array[i].length(),i,0);
    117         cout << num[i] << " "<< endl;
    118     }  
    119      cout << "------使用KMP算法得到的结果-------" <<endl;
    120      
    121      for(int i=0;i<m;i++){
    122          get_next(array[i],array[i].length());
    123         KMP(str,str.length(),array[i],array[i].length(),i,0);
    124         cout << num1[i] << " "<< endl;
    125     }
    126     return 0;
    127 }

  • 相关阅读:
    PAT A1094 The Largest Generation (25 分)——树的bfs遍历
    PAT A1055 The World's Richest (25 分)——排序
    PAT A1052 Linked List Sorting (25 分)——链表,排序
    PAT A1076 Forwards on Weibo (30 分)——图的bfs
    辅导员
    辅导员面试
    C程序设计
    Excel VBA 基本概念
    Excel函数
    导入excel表的数据到数据库ssh
  • 原文地址:https://www.cnblogs.com/henuliulei/p/10800698.html
Copyright © 2020-2023  润新知