1、string类find匹配法

#include <iostream>
#include <string>
#include <cstring>
#include <fstream>
using namespace std;
//字谜单词 hone,uito,raia,enan
int main()
{int n = 6;char puzzle[6][6]=  //字谜数组{'a','h','o','n','e','u','f','m','j','b','i','k','r','o','o','t','a','f','a','n','o','s','a','d','i','t','m','n','d','c','a','h','e','n','a','n'};
//测试puzzle数组
//    for(int i = 0; i < n; i++)
//    {
//        for(int j = 0; j < n; j++)
//        {
//            cout<<puzzle[i][j];
//        }
//        cout<<endl;
//    }string ptmp[8];    //存储puzzle的一段for(int i = 0; i < 6; i++){for(int j = 0; j < 6; j++){ptmp[i].append(1,puzzle[i][j]); //存储第一行到第六行if(i == j){ptmp[6].append(1,puzzle[i][j]); //存储正斜对角}if(i + j == 5){ptmp[7].append(1,puzzle[i][j]); //存储逆斜对角}}}
//测试ptmp数组
//    for(int i = 0; i < 8; i++)
//    {
//        cout<<ptmp[i]<<endl;
//    }ifstream filedic("G:\\wordlist.txt");   //从文件中读取数据if(!filedic.is_open())  //如果没打开,错误提示{cout << "Error: file opening failure."<<endl;return -1;}while(!filedic.eof())   //当文件未到尾部,继续循环{string tmp; //存储文件提取字符串filedic >> tmp; //提取字符串for(int i = 0; i < 8; i++)  //循环判断tmp与ptmp数组里的字符匹配{//如果发现,则输出//PS:这里用string类里面的find函数进行模式匹配//PS:因为字典过大,这里限制了字谜的长度,如不需要,可以去掉if(ptmp[i].find(tmp,0) != ptmp[i].npos && tmp.length() == 4){cout << tmp << endl;}}}filedic.close();return 0;
}

2、KMP匹配法

#include <iostream>
#include <string>
#include <cstring>
#include <fstream>
using namespace std;
//字谜单词 hone,uito,raia,enanvoid makenext(const string str,int next[])   //next数组
{next[0] = 0;int maxs; //最大前缀后缀相等数目for(int i = 1,maxs = 0;i < str.length(); i++){while( maxs > 0 && str.at(maxs) != str.at(i))    //当前缀下一位不等于后缀下一位时{//当匹配失败时,找到一个前缀序列,再与后缀匹配//a[0]...a[maxs].... a[i-maxs]...a[i-1]  a[i]...//                      匹配      匹配    匹配失败//                      a[0]....a[max-1] a[max]...//                                匹配    判断是否匹配//                        a[0]...a[j-1]   a[j]maxs = next[maxs - 1];  //next[max - 1]相当于匹配失败后,前缀作为后缀,所对应的前缀}if(str.at(maxs) == str.at(i))   //如果maxs和i匹配,则最大前缀后缀数目+1{maxs++;}next[i] = maxs;}//    测试输出
//    cout<< str << endl;
//    for(int i = 0; i < str.length(); i++)
//        cout << next[i] << " ";
//    cout << endl;
}bool KMP(const string motherstr,const string patternstr,int next[])  //KMP算法
{int maxs;   //最大前缀后缀相等数目makenext(patternstr,next);for(int i = 0,maxs = 0; i < motherstr.length(); i++){while(maxs > 0 && patternstr[maxs] != motherstr[i]) //当前缀下一位不等于后缀下一位时{//PS:这里的原理和makeNext方法里面一样,只不过这里的模式串是patterntr,母串是mothertrmaxs = next[maxs - 1];}if(patternstr[maxs] == motherstr[i])    //如果maxs和i匹配,则最大前缀后缀数目+1{maxs++;}if(maxs == patternstr.length())    //当最大前缀后缀相等数目与patternstr一样长时,则证明匹配成功{//测试匹配成功时,返回patternstr在motherstr里的位置//cout<<i-maxs+1;return true;}}return false;
}
int main()
{
//测试KMP算法是否正确
//    string str1= "aaaac";
//    string str2= "aaaa";
//    int next[100];
//    if(KMP(str1,str2,next))
//        cout<<"Yes."<<endl;
//    else
//        cout<<"NO."<<endl;int n = 6;char puzzle[6][6]=  //字谜数组{'a','h','o','n','e','u','f','m','j','b','i','k','r','o','o','t','a','f','a','n','o','s','a','d','i','t','m','n','d','c','a','h','e','n','a','n'};
//测试puzzle数组
//    for(int i = 0; i < n; i++)
//    {
//        for(int j = 0; j < n; j++)
//        {
//            cout<<puzzle[i][j];
//        }
//        cout<<endl;
//    }string ptmp[8];    //存储puzzle的一段for(int i = 0; i < 6; i++){for(int j = 0; j < 6; j++){ptmp[i].append(1,puzzle[i][j]); //存储第一行到第六行if(i == j){ptmp[6].append(1,puzzle[i][j]); //存储正斜对角}if(i + j == 5){ptmp[7].append(1,puzzle[i][j]); //存储逆斜对角}}}
//测试ptmp数组
//    for(int i = 0; i < 8; i++)
//    {
//        cout<<ptmp[i]<<endl;
//    }ifstream filedic("G:\\wordlist.txt");   //从文件中读取数据if(!filedic.is_open())  //如果没打开,错误提示{cout << "Error: file opening failure."<<endl;return -1;}while(!filedic.eof())   //当文件未到尾部,继续循环{int next[1000]; //next数组string tmp; //存储文件提取字符串filedic >> tmp; //提取字符串for(int i = 0; i < 8; i++)  //循环判断tmp与ptmp数组里的字符匹配{//如果发现,则输出//PS:KMP匹配法//PS:因为字典过大,这里限制了字谜的长度,如不需要,可以去掉if(KMP(ptmp[i],tmp,next)&& tmp.length() == 4){cout<< tmp << endl;}}}filedic.close();return 0;
}

3、优化KMP算法(待实现)

PS:运行后发现string类中的匹配算法比KMP算法要快,不解释啊,有时间写完优化KMP算法再比较下。

简单的字谜游戏--可扩展--2015年7月25日14:58:00V1.1版相关推荐

  1. KMP算法(待优化)--2015年7月25日14:04:25V1.0版

    #include <iostream> #include <string> #include <cstring> using namespace std;void ...

  2. 传智播客 刘意_2015年Java基础视频-深入浅出精华版 笔记(2015年10月25日23:28:50)

    day01 win 7系统打开DOS有趣方法:按住shift+右键,单击"在此处打开命令窗口"(注意:在此处可以是任何的文件夹,不一定是桌面) 用DOS删除的文件不可以在回收站恢复 ...

  3. 我来说说2015年8月25日锤子科技夏季手机发布会的内情

    我来说说2015年8月25日锤子科技夏季手机发布会的内情, 虽然我也没去现场,我也不是锤子科技的,我跟锤子科技的人也不熟.那算什么内情啊?好吧,改一下,我来瞎说一下2015锤子科技夏季手机发布会的内情 ...

  4. 迷宫问题(栈解决)--2015年8月9日19:23:23v1.0版

    1.问题描述 多年以来,迷宫问题一直是令人感兴趣的题目.实验心理学家训练老鼠在迷宫中寻找食物.许多神秘主义小说家也曾把英国乡村花园迷宫作为谋杀现场.计算机工作者也对迷宫感兴趣.因为它可以展现栈的巧妙应 ...

  5. 各种搜索算法比较--2015年7月26日16:42:45V1.0版

    1.顺序查找 int SequenceSearch(int a[],int n,int key) //顺序查找 {for(int i = 0; i < n; i++){if(key == a[i ...

  6. 各种排序算法比较--2015年7月23日22:33:43v1.0版

    #include <iostream> #include <fstream> #include <cstdlib> #include <ctime> u ...

  7. 2015年2月25日

    二叉树遍历的递归与非递归实现 本次测试实现了二叉树先序遍历的递归与非递归实现,并测试了其性能,测试结果如预先考虑的一致,就是非递归的性能要不递归的性能高. 同时也实现了二叉树的广度优先的遍历,通过qu ...

  8. linux运维实战练习-2015年9月13日-9月15日课程作业(练习)安排

    一.作业(练习)内容: 1.描述shell程序的运行原理(可附带必要的图形说明): 2.总结shell编程中所涉及到的所有知识点(如:变量.语法.命令状态等等等,要带图的哟): 3.总结课程所讲的所有 ...

  9. 始于2015年11月23日,终于2018年08月08日

    留念. 2015年11月23日:在一起 2016年01月17日-21日:北京机场,我们❤ 2016年04月16日:去他所在城市--成都 2016年06月04-06日:第一次小旅游--都江堰.青城山 2 ...

最新文章

  1. Python pytagcloud 中文分词 生成标签云 系列(一)
  2. 一文概述 2018 年深度学习 NLP 十大创新思路
  3. C# System.Guid.NewGuid() 格式化
  4. SilverLight学习笔记--建立Silverlight自定义控件(5)--绑定动画效果
  5. python如何使用字典中的值并进行比较_python – 如何比较字典中的值?
  6. 【Web自动化测试——代码篇十二】自动化测试模型——数据驱动测试和关键字驱动测试...
  7. Tensorflow中文文档
  8. 石青建站养站大师 v1.8.6.1
  9. java多线程通信方法
  10. 学习笔记 十一 : iscsi
  11. web页面的回流,认识与避免
  12. FPS游戏-罗技鼠标-通用的压枪宏
  13. HiJson(Json格式化工具)64位 V2.1.2绿色版
  14. iot行业的流量规律
  15. 波士顿动力Spot mini,MIT 猎豹、宇树科技、蔚蓝四足机器人类别
  16. Python快速入门(1)常用容器和内置函数介绍
  17. 湖南大学夏令营c语言考试题,夏令营试题
  18. 2018年看书计划(40本)
  19. 什么叫域名解析SSL证书?
  20. JS JavaScript入门

热门文章

  1. Java JDK安装和配置
  2. Linux中Tomcat 服务的搭建
  3. 记,NSProxy需要实现哪些方法?
  4. VSCode 实时预览HTML网页效果 - Live Server插件
  5. yarn的配置 -- 无法将“yo”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
  6. 用python画渐变的圆_Python成像库(PIL)绘图 – 带渐变的圆角矩形
  7. Python爬虫的基本原理
  8. 从零搭建Redis-Scrapy分布式爬虫
  9. LeetCode题 - 1 两数之和
  10. 一个牛逼的coder是这样诞生的。