斐波那契字符串_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 }
转载于:https://www.cnblogs.com/henuliulei/p/10800698.html
斐波那契字符串_KMP相关推荐
- 4245: KI的斐波那契 递归
4245: KI的斐波那契 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 562 Solved: 213 Description KI十分喜欢美丽而 ...
- C++以字符串形式返回第N个斐波那契的算法(附完整源码)
C++以字符串形式返回第N个斐波那契的算法 C++以字符串形式返回第N个斐波那契的算法完整源码(定义,实现,main函数测试) C++以字符串形式返回第N个斐波那契的算法完整源码(定义,实现,main ...
- 蓝桥杯练习题:对给定整数基于斐波拉契数列构造字符串
文章目录 一.提出问题 二.解决问题 (一)分析 (二)编程 1.构造[1, n]范围内的斐波拉契数列表 2.基于斐波拉契数列构造字符串函数 3.编写主控程序 4.运行程序,查看结果 三.优化算法 一 ...
- python:考试前,练手习题(斐波那契数,字符串排序,九九乘法表,水仙花数,求和...求数字倍数,(保佑不挂科!)
整理一些练手的题目(含代码),可能不是特别优美,有些繁琐,但是等有时间再优化吧~~ 1.水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = ...
- 1008day1:列表-字符串基础知识、正则提取字符串小数、python数据类型、判断为假的方法、格式判断if elif elif else、字符串遍、计算器、提取str字母、斐波那契数列、水仙花数
文章目录 一.提取字符串里面的小数:正则 二.Python数据类型 三.== 字符串:str基础知识 == 四.整型及浮点型 五.判断为假的方法 六.判断格式 七.循环:字符串遍历 六.循环1~100 ...
- 挑兵挑将、小码哥的跳棋游戏 、数字问题、斐波那契,但是是字符串 马蹄集
挑兵挑将 // // Created by abner on 2023/3/20. // #include <bits/stdc++.h> using namespace std; int ...
- 把数字翻译成字符串/斐波那契数列/青蛙跳台阶
今天做到剑指Offer中面试题46:把数字翻译成字符串,一看,这不是之前的斐波那契数列和青蛙跳台阶的翻版吗?遂记录一下解题思路. 题目:给定一个数字,我们按照如下规则把它翻译为字符串: 0 0 0 ...
- C# 最快的逐一打印斐波那契结果数列的算法
用这种方法就无需将数列中的每一个元素都计算一遍了! 说多无谓,直接上代码吧! private void button5_Click(object sender, EventArgs e) { FiBo ...
- html5斐波那契数列,经典的斐波那契数列与arguments.callee
经典的斐波那契数列与arguments.callee HTML5学堂:提到斐波那契数列,很多人还不是太清楚,但是如果提到兔子繁殖这个经典题目,相信学过计算机语言的人们会立刻感觉"亲切&quo ...
- 斐波拉契数列python123_python计算机二级题目分类汇总
知乎视频www.zhihu.com 选择题:40 基本操作题:5 简单应用:10/15 综合应用:20 主要是对文本进行处理 基本操作题 format()函数 用符号填充 {序号:填充 对齐 宽度 ...
最新文章
- dubbo源码解析-集群容错架构设计
- mysql 主从 keepalived_MySQL之双向主从加keepalived高可用
- 独家 | 一文读懂自然语言处理NLP(附学习资料)
- USB-WiFi在x210板子上的移植
- 数据库临时表空间设置
- python怎么做软件界面_python – 如何自定义桌面应用程序的标题栏和窗口
- java 枚举的实现原理
- 重启php7.0-fpm
- 为什么Bert的三个Embedding可以进行相加?
- Atitit 效率提升分析与解决方案 1. 三大模式 优化资源配置 通过降低难度 提升培训	1 1.1. 优化资源配置	1 1.2. 通过降低难度	1 1.3. 提升培训	1 2. 有效与立即可
- 单元测试(一)使用Junit进行单元测试
- win10下如何快速安装迷你迅雷
- 通信专业顶刊_通信类权威SCI期刊(部分)
- php ctype xdigit,PHP中的ctype_xdigit()函数
- Playful MySQL 2: Transactions and some of its potential problems
- 微信小程序获得二维码
- 解决No backends or directors found in VCL program, at least one is necessary. Runn
- 普林斯顿宣布开源 25 核处理器
- 2022年全球市场介质浆料总体规模、主要生产商、主要地区、产品和应用细分研究报告
- 富途入金步骤记录(个人使用)
热门文章
- 你以为海淘产品能逃过海关法眼?大数据技术一网打尽
- linux vi 块操作、多窗口
- SVN Description : The working copy is locked due to a previous error.
- 第五讲 python函数
- 关于ADO之AddNew,UPdate与Identity列
- iOS 很酷的动画效果
- 我脸都问绿了!二面竟然被问到MySQL时间类型datetime、bigint及timestamp的查询效率......
- 你知道Arrays.asList 有坑吗?千万别踩啊!
- 今天我们开通知识星球了~
- 【系统架构】如何逐步去构建一个大型网站系统