【经典算繁体08题】字串核对
欢迎关注专栏,持续更新!
欢迎关注公众号[搞前端的半夏],回复[算法],获取各种算法资料。
说明
今日的一些高阶程式语言对于字串的处理支援越来越强大(例如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题】字串核对相关推荐
- 2019第十届蓝桥杯C/C++ B组省赛 —— 第二题:年号字串
试题 B:年号字串 本题总分:5 分 [问题描述] 小明用字母 A 对应数字 1,B 对应 2,以此类推,用 Z 对应 26.对于 27 以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 ...
- python 判断 字串包含_数百道BAT等大厂最新Python面试真题,学到你手软!
春招临近,无论是要找工作的准毕业生,还是身在职场想要提升自己的程序员,提升自己的算法内功心法.提升 Python 编程能力,总是大有裨益的.今天,小编发现了一份好资源:Python 实现的面试题集锦! ...
- [剑指offer]面试题第[48]题[Leetcode][JAVA][第3题][无重复字符的最长字串][滑动窗口][HashSet/Map]
[问题描述][第3题][无重复字符的最长字串] 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度.示例 1:输入: "abcabcbb" 输出: 3 解释: 因为无重 ...
- leetcode必刷题(四)lee75 颜色分类、lee76 最小覆盖字串、lee78 子集、lee79 单词搜索、lee84 柱状图中最大的矩形、lee85 最大矩形、lee96 不同的二叉搜索树、
lee75 颜色分类 patition 三个指针 lee76 最小覆盖字串 滑动窗口 lee78 子集 无重复数字 回溯 lee79 单词搜索 回溯 lee84 柱状图中最大的矩形 单调栈 lee85 ...
- LeetCode中等题之无重复字符的最长字串
题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 &q ...
- 蓝桥杯 基础练习 01字串(水题)
基础练习 01字串 时间限制:1.0s 内存限制:256.0MB 问题描述 对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能.它们的前几个是: 00000 00001 00010 ...
- Java里面是先算乘除后算加减_java.怎么实现字串符的先乘除后加减阿
java.怎么实现字串符的先乘除后加减阿 关注:91 答案:3 信息版本:手机版 电脑版 解决时间 2021-01-18 00:22 提问者壹玍徴戰何亽陪 2021-01-17 10:00 pub ...
- 数据结构经典算法面试题
转自:http://hi.baidu.com/geogre_jsj/blog/item/e4b98fd2aab5aa3611df9b92.html 由于这些题,实在太火了.所以,应广大网友建议要求,在 ...
- python leetcode_python实现leetcode中无重复字符的最长字串
无重复字符的最长字串是一道经典的额字符串处理算法的题目,日常编程过程中,处理字符串是很多见的.用Python来实现leetcode这道算法题,这题会涉及到一个概念"滑动窗口"的概 ...
最新文章
- 给大家分享一个私藏已久的Python神器!
- Akka in JAVA(三)
- UITabBarController 的配置
- 数据库如何闪回到某个时间点?
- yunyang1994 tensorflow_yolov3 ./checkpoint/yolo3_coco_demo.ckpt does not exist !!! Now it starts to
- 一行命令从 APK 文件中提取 Endpoint 及 URL
- 移动web端的react.js组件化方案
- MapGIS67二次开发环境搭建
- python实现KD树
- 60岁首席工程师被SpaceX边缘化,主管:我怕他退休或死了
- Excel中提取单元格数字
- 2020-04-24--黑寡妇的复活
- 【数据降维】数据降维方法分类
- ikbc c87 Win键失灵/锁定
- 基于PCF8591芯片的使用
- golang 如何快速测试代码
- 未来侠机器人教育:不能脱离教育的本质去谈机器人教育培训
- 构建module遇到pom报错Parent 'Unkown:Unkown:Unkown' has problems
- EV2400配合bqStudio的使用及电量计相关
- 新坑--阿里云图库引入
热门文章
- 二战中真正的打酱油船,神一样的存在
- [ecshop 经验 ]transport.js run error 68ecshop 小京东 火狐提示 同源策略和跨域访问 68ecshop
- MySQL 5.6.21下载安装之安装篇(二)
- 软件工程中新功能开发流程
- matlab安装c盘吗,matlab的安装步骤(附winC盘“用户”文件夹下账户名的更改方法).doc...
- peek用法解决多读一行
- Go语言处理Windows系统的图标ICO文件(中)
- 马云给员工的超牛演讲
- mysql 5.7 group replication 之五 [ERROR] Plugin group_replication reported: 'Table tmp_t0 does not hav
- maven报错 Check M2 HOME environment variable and mvn script m