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

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

转载于:https://www.cnblogs.com/henuliulei/p/10800698.html

斐波那契字符串_KMP相关推荐

  1. 4245: KI的斐波那契 递归

    4245: KI的斐波那契 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 562  Solved: 213 Description KI十分喜欢美丽而 ...

  2. C++以字符串形式返回第N个斐波那契的算法(附完整源码)

    C++以字符串形式返回第N个斐波那契的算法 C++以字符串形式返回第N个斐波那契的算法完整源码(定义,实现,main函数测试) C++以字符串形式返回第N个斐波那契的算法完整源码(定义,实现,main ...

  3. 蓝桥杯练习题:对给定整数基于斐波拉契数列构造字符串

    文章目录 一.提出问题 二.解决问题 (一)分析 (二)编程 1.构造[1, n]范围内的斐波拉契数列表 2.基于斐波拉契数列构造字符串函数 3.编写主控程序 4.运行程序,查看结果 三.优化算法 一 ...

  4. python:考试前,练手习题(斐波那契数,字符串排序,九九乘法表,水仙花数,求和...求数字倍数,(保佑不挂科!)

    整理一些练手的题目(含代码),可能不是特别优美,有些繁琐,但是等有时间再优化吧~~ 1.水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = ...

  5. 1008day1:列表-字符串基础知识、正则提取字符串小数、python数据类型、判断为假的方法、格式判断if elif elif else、字符串遍、计算器、提取str字母、斐波那契数列、水仙花数

    文章目录 一.提取字符串里面的小数:正则 二.Python数据类型 三.== 字符串:str基础知识 == 四.整型及浮点型 五.判断为假的方法 六.判断格式 七.循环:字符串遍历 六.循环1~100 ...

  6. 挑兵挑将、小码哥的跳棋游戏 、数字问题、斐波那契,但是是字符串 马蹄集

    挑兵挑将 // // Created by abner on 2023/3/20. // #include <bits/stdc++.h> using namespace std; int ...

  7. 把数字翻译成字符串/斐波那契数列/青蛙跳台阶

      今天做到剑指Offer中面试题46:把数字翻译成字符串,一看,这不是之前的斐波那契数列和青蛙跳台阶的翻版吗?遂记录一下解题思路. 题目:给定一个数字,我们按照如下规则把它翻译为字符串: 0 0 0 ...

  8. C# 最快的逐一打印斐波那契结果数列的算法

    用这种方法就无需将数列中的每一个元素都计算一遍了! 说多无谓,直接上代码吧! private void button5_Click(object sender, EventArgs e) { FiBo ...

  9. html5斐波那契数列,经典的斐波那契数列与arguments.callee

    经典的斐波那契数列与arguments.callee HTML5学堂:提到斐波那契数列,很多人还不是太清楚,但是如果提到兔子繁殖这个经典题目,相信学过计算机语言的人们会立刻感觉"亲切&quo ...

  10. 斐波拉契数列python123_python计算机二级题目分类汇总

    知乎视频​www.zhihu.com 选择题:40 基本操作题:5 简单应用:10/15 综合应用:20 主要是对文本进行处理 基本操作题 format()函数 用符号填充 {序号:填充 对齐 宽度 ...

最新文章

  1. dubbo源码解析-集群容错架构设计
  2. mysql 主从 keepalived_MySQL之双向主从加keepalived高可用
  3. 独家 | 一文读懂自然语言处理NLP(附学习资料)
  4. USB-WiFi在x210板子上的移植
  5. 数据库临时表空间设置
  6. python怎么做软件界面_python – 如何自定义桌面应用程序的标题栏和窗口
  7. java 枚举的实现原理
  8. 重启php7.0-fpm
  9. 为什么Bert的三个Embedding可以进行相加?
  10. Atitit 效率提升分析与解决方案 1. 三大模式 优化资源配置 通过降低难度 提升培训 1 1.1. 优化资源配置 1 1.2. 通过降低难度 1 1.3. 提升培训 1 2. 有效与立即可
  11. 单元测试(一)使用Junit进行单元测试
  12. win10下如何快速安装迷你迅雷
  13. 通信专业顶刊_通信类权威SCI期刊(部分)
  14. php ctype xdigit,PHP中的ctype_xdigit()函数
  15. Playful MySQL 2: Transactions and some of its potential problems
  16. 微信小程序获得二维码
  17. 解决No backends or directors found in VCL program, at least one is necessary. Runn
  18. 普林斯顿宣布开源 25 核处理器
  19. 2022年全球市场介质浆料总体规模、主要生产商、主要地区、产品和应用细分研究报告
  20. 富途入金步骤记录(个人使用)

热门文章

  1. 你以为海淘产品能逃过海关法眼?大数据技术一网打尽
  2. linux vi 块操作、多窗口
  3. SVN Description : The working copy is locked due to a previous error.
  4. 第五讲 python函数
  5. 关于ADO之AddNew,UPdate与Identity列
  6. iOS 很酷的动画效果
  7. 我脸都问绿了!二面竟然被问到MySQL时间类型datetime、bigint及timestamp的查询效率......
  8. 你知道Arrays.asList 有坑吗?千万别踩啊!
  9. 今天我们开通知识星球了~
  10. 【系统架构】如何逐步去构建一个大型网站系统