欢迎关注专栏,持续更新!
欢迎关注公众号[搞前端的半夏],回复[算法],获取各种算法资料。

说明

今日的一些高阶程式语言对于字串的处理支援越来越强大(例如Java、Perl等),不过字串搜寻本身仍是个值得探讨的课题,在这边以Boyer- Moore法来说明如何进行字串说明,这个方法快且原理简洁易懂。

解法

字串搜寻本身不难,使用暴力法也可以求解,但如何快速搜寻字串就不简单了,传统的字串搜寻是从关键字与字串的开头开始比对,例如 Knuth-Morris-Pratt 演算法 字串搜寻,这个方法也不错,不过要花时间在公式计算上;Boyer-Moore字串核对改由关键字的后面开始核对字串,并制作前进表,如果比对不符合则依前进表中的值前进至下一个核对处,假设是p好了,然后比对字串中p-n+1至p的值是否与关键字相同。
如果关键字中有重复出现的字元,则前进值就会有两个以上的值,此时则取前进值较小的值,如此就不会跳过可能的位置,例如texture这个关键字,t的前进值应该取后面的3而不是取前面的7。

#include <stdio.h>
#include <stdlib.h>
#include <string.h> void table(char*); // 建立前进表
int search(int, char*, char*); // 搜寻关键字
void substring(char*, char*, int, int); // 取出子字串 int skip[256]; int main(void) {
char str_input[80];
char str_key[80];
char tmp[80] = {'\0'};
int m, n, p;
printf("请输入字串:");
gets(str_input);
printf("请输入搜寻关键字:");
gets(str_key);
m = strlen(str_input); // 计算字串长度
n = strlen(str_key);
table(str_key);
p = search(n-1, str_input, str_key); while(p != -1) {
substring(str_input, tmp, p, m);
printf("%s\n", tmp);
p = search(p+n+1, str_input, str_key);
} printf("\n");
return 0;
} void table(char *key) {
int k, n;
n = strlen(key);
for(k = 0; k <= 255; k++)
skip[k] = n;
for(k = 0; k < n - 1; k++)
skip[key[k]] = n - k - 1;
} int search(int p, char* input, char* key) {
int i, m, n;
char tmp[80] = {'\0'};
m = strlen(input);
n = strlen(key); while(p < m) {
substring(input, tmp, p-n+1, p);
if(!strcmp(tmp, key)) // 比较两字串是否相同
return p-n+1;
p += skip[input[p]];
}
return -1;
} void substring(char *text, char* tmp, int s, int e) {
int i, j;
for(i = s, j = 0; i <= e; i++, j++) mp[j] = text[i];
tmp[j] = '\0';
}

欢迎关注公众号[搞前端的半夏],回复[算法],获取各种算法资料。

【经典算繁体08题】字串核对相关推荐

  1. 2019第十届蓝桥杯C/C++ B组省赛 —— 第二题:年号字串

    试题 B:年号字串 本题总分:5 分 [问题描述] 小明用字母 A 对应数字 1,B 对应 2,以此类推,用 Z 对应 26.对于 27 以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 ...

  2. python 判断 字串包含_数百道BAT等大厂最新Python面试真题,学到你手软!

    春招临近,无论是要找工作的准毕业生,还是身在职场想要提升自己的程序员,提升自己的算法内功心法.提升 Python 编程能力,总是大有裨益的.今天,小编发现了一份好资源:Python 实现的面试题集锦! ...

  3. [剑指offer]面试题第[48]题[Leetcode][JAVA][第3题][无重复字符的最长字串][滑动窗口][HashSet/Map]

    [问题描述][第3题][无重复字符的最长字串] 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度.示例 1:输入: "abcabcbb" 输出: 3 解释: 因为无重 ...

  4. leetcode必刷题(四)lee75 颜色分类、lee76 最小覆盖字串、lee78 子集、lee79 单词搜索、lee84 柱状图中最大的矩形、lee85 最大矩形、lee96 不同的二叉搜索树、

    lee75 颜色分类 patition 三个指针 lee76 最小覆盖字串 滑动窗口 lee78 子集 无重复数字 回溯 lee79 单词搜索 回溯 lee84 柱状图中最大的矩形 单调栈 lee85 ...

  5. LeetCode中等题之无重复字符的最长字串

    题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 &q ...

  6. 蓝桥杯 基础练习 01字串(水题)

    基础练习 01字串 时间限制:1.0s   内存限制:256.0MB 问题描述 对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能.它们的前几个是: 00000 00001 00010 ...

  7. Java里面是先算乘除后算加减_java.怎么实现字串符的先乘除后加减阿

    java.怎么实现字串符的先乘除后加减阿 关注:91  答案:3  信息版本:手机版 电脑版 解决时间 2021-01-18 00:22 提问者壹玍徴戰何亽陪 2021-01-17 10:00 pub ...

  8. 数据结构经典算法面试题

    转自:http://hi.baidu.com/geogre_jsj/blog/item/e4b98fd2aab5aa3611df9b92.html 由于这些题,实在太火了.所以,应广大网友建议要求,在 ...

  9. python leetcode_python实现leetcode中无重复字符的最长字串

    ​无重复字符的最长字串是一道经典的额字符串处理算法的题目,日常编程过程中,处理字符串是很多见的.用Python来实现leetcode这道算法题,这题会涉及到一个概念"滑动窗口"的概 ...

最新文章

  1. 给大家分享一个私藏已久的Python神器!
  2. Akka in JAVA(三)
  3. UITabBarController 的配置
  4. 数据库如何闪回到某个时间点?
  5. yunyang1994 tensorflow_yolov3 ./checkpoint/yolo3_coco_demo.ckpt does not exist !!! Now it starts to
  6. 一行命令从 APK 文件中提取 Endpoint 及 URL
  7. 移动web端的react.js组件化方案
  8. MapGIS67二次开发环境搭建
  9. python实现KD树
  10. 60岁首席工程师被SpaceX边缘化,主管:我怕他退休或死了
  11. Excel中提取单元格数字
  12. 2020-04-24--黑寡妇的复活
  13. 【数据降维】数据降维方法分类
  14. ikbc c87 Win键失灵/锁定
  15. 基于PCF8591芯片的使用
  16. golang 如何快速测试代码
  17. 未来侠机器人教育:不能脱离教育的本质去谈机器人教育培训
  18. 构建module遇到pom报错Parent 'Unkown:Unkown:Unkown' has problems
  19. EV2400配合bqStudio的使用及电量计相关
  20. 新坑--阿里云图库引入

热门文章

  1. 二战中真正的打酱油船,神一样的存在
  2. [ecshop 经验 ]transport.js run error 68ecshop 小京东 火狐提示 同源策略和跨域访问 68ecshop
  3. MySQL 5.6.21下载安装之安装篇(二)
  4. 软件工程中新功能开发流程
  5. matlab安装c盘吗,matlab的安装步骤(附winC盘“用户”文件夹下账户名的更改方法).doc...
  6. peek用法解决多读一行
  7. Go语言处理Windows系统的图标ICO文件(中)
  8. 马云给员工的超牛演讲
  9. mysql 5.7 group replication 之五 [ERROR] Plugin group_replication reported: 'Table tmp_t0 does not hav
  10. maven报错 Check M2 HOME environment variable and mvn script m