字符串匹配的双重递归式写法

字符串的匹配有很高效的KMP、Sunday等算法,可供使用。下面使用的匹配算法本质上是朴素的,但它的双重递归式的写法仍然值得借鉴。

完整示例代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *SubStrWithR(const char *str, const char *sub)
{
	if (str == NULL || sub == NULL)
		return NULL;

	int find = isSame(str, sub);
	if (find)
		return str;

	if (*str)
		return SubStrWithR(str + 1, sub);
	else
		return NULL;
}
int isSame(const char *str, const char *sub)
{
	if (*sub == '\0')
		return 1;

	return (*str == *sub) && isSame(str + 1, sub + 1);
}
int main()
{
	char str[] = "tasklist";
	printf("pattern string: \n");
	puts(str);
	char sub[20];
	printf("Input a substring: ");
	scanf("%s", sub);
	while(strcmp(sub, "exit"))
	{
		char *find = SubStrWithR(str, sub);
		if (find == NULL)
			printf("Not found!\n");
		else
			printf("%p, %s\n", find, find);

		printf("Input a substring : ");
		scanf("%s", sub);
	}
	return 0;
}

运行

时间: 2024-10-01 04:38:04

字符串匹配的双重递归式写法的相关文章

正则表达式的使用,字符串提取,字符串匹配(C#语言)

在程序中常常设计字符串的处理,比如①:判断用户的输入字符串是否符合要求,是否是非法字符串,②:取出一个很复杂字符串的某一程序中需要的部分等 这事用自己写算法判断通常是十分困难的,所以遇到字符串的处理时要很快想到用正则表达式. 一:正则表达式元字符 •要想学会正则表达式,理解元字符是一个必须攻克的难关.不用刻意记 •.:匹配任何单个字符.例如正则表达式“b.g”能匹配如下字符串:“big”.“bug”.“b g”,但是不匹配“buug”,“b..g”可以匹配“buug”. •[ ] :匹配括号中的

[CLRS][CH 32]字符串匹配

问题简介 对于给定文本 T[n] 和模式 P[m],找到一个位移量 s,使得 T[s + j] = P[j] (0 <= s <= n-m, 1 <= j <= m),则说明模式 P 在文本 T 中出现且位移为 s.所以字符串问题就是在给定文本 T 中,找出指定模式 P 出现的所有有效位移的问题. 记号和术语 长度为0的空字符串用 ? 表示.字符串 x 的长度用 |x| 表示.字符串 x, y 的连接表示为xy,长度为 |x|+|y|.对于字符串 x, y, w,如果 x = wy

动态规划 | 带有通配符的字符串匹配(浅显易懂)

带有通配符的字符串匹配 一.Leetcode | 44 Wildcard Matching(只有一个字符串包含通配符) 题目很简单,就是说两个字符串,一个含有通配符,去匹配另一个字符串:输出两个字符串是否一致. 注意:'?'表示匹配任意一个字符,'*'表示匹配任意字符0或者多次 首先,我们想到暴力破解.如果从头到尾的破解,到第二个字符时,是否匹配成功取决于第一个字符是否匹配成功! 所以我们想到应该要用到动态规划: 既然用到动态规划,最重要的是设置初值 和找到递推式: 于是,我们开始分析初值怎么设

字符串匹配--kmp算法原理整理

kmp算法原理:求出P0···Pi的最大相同前后缀长度k: 字符串匹配是计算机的基本任务之一.举例,字符串"BBC ABCDAB ABCDABCDABDE",里面是否包含另一个字符串"ABCDABD"? 许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一. KMP算法搜索如下: 1.首先,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜索词"ABCDABD"的

字符串匹配之KMP算法

1.前言: leetcode上的28. Implement strStr()就是一个字符串匹配问题.字符串匹配是计算机的基本任务之一.所以接下来的两篇日志,都对相关的算法进行总结. 2.暴力求解算法 如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有: 如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹配下一个字符: 如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0.相当于每次匹配失败时,i 回溯

字符串匹配问题 ---- 算法导论读书笔记

字符串匹配是一个很常见的问题,可以扩展为模式的识别,解决字符串问题的思想被广泛地应用.介绍四种解决该问题的办法,包括:最朴素的遍历法,Rabin-Karp算法,自动机机匹配,Knuth-Morris-Pratt算法即耳熟能详的KMP. 在一开始,先对时间复杂度做出一个总扩(从大到小):[1]朴素法:O( (n-m+1)m ):[2]Rabin-Karp:预处理:O(m),匹配:最坏O( (n-m+1)m ),但是平均和实际中比这个好得多:[3]自动机:预处理O(m|Σ|),匹配O(n):[4]K

字符串匹配常见算法(BF,RK,KMP,BM,Sunday)

今日了解了一下字符串匹配的各种方法. 并对sundaysearch算法实现并且单元. 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目.此算法通常输入为原字符串(string)和子串(pattern),要求返回子串在原字符串中首次出现的位置.比如原字符串为"ABCDEFG",子串为"DEF",则算法返回3.常见的算法包括:BF(Brute Force,暴力检索).RK(Robin-Karp,哈希检索).KMP(教科书上最常见算法).BM(

算法——字符串匹配之KMP算法

前言 本节介绍Knuth-Morris-Pratt字符串匹配算法(简称KMP算法).该算法最主要是构造出模式串pat的前缀和后缀的最大相同字符串长度数组next,和前面介绍的<朴素字符串匹配算法>不同,朴素算法是当遇到不匹配字符时,向后移动一位继续匹配,而KMP算法是当遇到不匹配字符时,不是简单的向后移一位字符,而是根据前面已匹配的字符数和模式串前缀和后缀的最大相同字符串长度数组next的元素来确定向后移动的位数,所以KMP算法的时间复杂度比朴素算法的要少,并且是线性时间复杂度,即预处理时间复

算法题之字符串匹配问题

我最近复习一道困难程度的算法题,发现了许多有趣之处.在借鉴了他人解法后,发现从最简单的情况反推到原题是一种解锁新进阶的感觉.从递归到动态规划,思维上一步一步递进,如同一部跌宕起伏的小说,记录下来和诸君共赏之. 题目如下: 给你一个字符串?s?和一个字符规律?p,请你来实现一个支持 '.'?和?'*'?的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖?整个?字符串?s的,而不是部分字符串. 说明: s?可能为空,且只包含从?a-z?的小写字母