字符串 匹配-一道算法问题字符串匹配的

问题描述

一道算法问题字符串匹配的

为了能有效地辅助对话系统完成限定领域完整对话流程,我们需要一个强大的匹配功能,现在要求你用编程来实现以下功能:
我们给出N个句子,作为语料库,语料库的句子分为以下三类:
1. 包含"_","_"可以匹配任意长度的字符串或者空串,例如,“早上好,店家!”能被语料库中的“_早上好_”匹配到,这类句子优先级最高。
2. 包含"*","*"可以匹配任意长度的字符串或者空串,例如,“早上好,店家!”能被语料库中的“*早上好*”匹配到,这类句子优先级最低。
3. 不包含"_"和"*",这种句子要求完全匹配,例如,只有“早上好,店家!”能被语料库中的“早上好,店家!”匹配到,这类句子优先级居中。
不会有句子中同时出现"_"和"*",也不会出现连续的"_"或者"*",例如“__你好”和“**你好”或者“*你好_”这种句子是非法输入。
接下来有M句用户的输入,对于每一句输入,要求回答,语料库中能匹配到的句子,如果有多句匹配到了,请输出优先级最高的一句,如果优先级一样,请输出,除"_"和"*"外其他字符最多的,如果仍然有多句输出,请输出任意一句,详见输入样例。

输入:
第1行,输入一个整数N(N<=100),表示语料库中的句子数
接下来N行,每行输入一个句子,表示语料库中的句子
第N+2行,输入一个整数M(M<=100),表示用户都输入数
接下来M行,每行输入一个用户的句子
所有输入只包含"_"和"*"作为特别意义字符,常用中文标点符号,中文字符,以及数字,每个句子不超过100字节。
输出:
M行
对于每个用户输入,按上述要求输出一个匹配到的句子,匹配不到输出"匹配不到"。

Sample input1

早上好
早上好
早上好,店家!

早上好,店家!
早上好,小子!
Sample output1
早上好
早上好

Sample input2

早上好,
早上好
早上好,店家!

早上好,店家!
早上好
早上好,小子!
Sample output2
早上好,店家!
早上好
早上好,

Sample input3

早上好,*
早上好*
早上好,店家!

早上好,店家!
早上好
小子,早上好!
Sample output3
早上好,店家!
早上好*
匹配不到

%20的数据的语料库只包含第3类句子
%50的数据的语料库只包含第1类和第3类句子
%100的数据的语料库包含1,2,3类的句子

当N<=50000时,M<=100时,你所设计的算法时间复杂度是多少?如何实现高效,快速匹配。
当N<=50000时,M<=10000时,你所设计的算法时间复杂度是多少?如何实现高效,快速匹配。

时间: 2024-12-03 04:14:55

字符串 匹配-一道算法问题字符串匹配的的相关文章

C语言实现字符串匹配KMP算法_C 语言

字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 下面的的KMP算法的解释步骤 1. 首先,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜索词"ABCDABD"的第一个字符,进行比较.因为B与A不匹配,所以搜索词后移一位. 2. 因为B与A不匹配,搜索词再往后移. 3. 就这样,直到字符

[算法系列之十二]字符串匹配之蛮力匹配

引言 字符串匹配是数据库开发和文字处理软件的关键.幸运的是所有现代编程语言和字符串库函数,帮助我们的日常工作.不过理解他们的原理还是比较重要的. 字符串算法主要可以分为几类.字符串匹配就是其中之一.当我们提到字符串匹配算法,最基本的方法就是所谓的蛮力解法,这意味着我们需要检查每一个文本串中的字符是否和匹配串相匹配.一般来说我们有文本串和一个匹配串(通常匹配串短于文本串).我们需要做的就是回答这个匹配串是否出现在文本串中. 概述 字符串蛮力匹配法的原理非常简单.我们必须检查匹配串的第一个字符与文本

[算法系列之十四]字符串匹配之Morris-Pratt字符串搜索算法

前言 我们前面已经看到,蛮力字符串匹配算法和Rabin-Karp字符串匹配算法均非有效算法.不过,为了改进某种算法,首先需要详细理解其基本原理.我们已经知道,暴力字符串匹配的速度缓慢,并已尝试使用Rabin-Karp中的一个散列函数对其进行改进.问题是,Rabin-Karp的复杂度与强力字符串匹配相同,均为O(mn). 我们显然需要采用一种不同方法,但为了提出这种不同方法,先来看看暴力字符串匹配有什么不妥之处.事实上,再深入地研究一下它的基本原理,就能找到问题的答案了. 在暴力匹配算法中,需要检

字符串匹配的KMP算法

字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一.它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth. 这种算法不太容易理解,网上有很多解释,但读起来都很费劲.直到读到Jake Boxer的文章,我才真正理解这种算法.下面,我用自己的语言

模糊字符串匹配:双重解密算法

名称匹配的一个大问题是错误的倾向.有许多不同的方式,人们拼写相同的名字,打字错误,误读了另一个人说的话.有许多方法可以免费形式的语言数据被破坏.当您需要搜索/匹配不良数据时,会导致许多头疼. 有很多不同的方法来解决它.像Levenshtein算法一样,它计算出使一个字符串匹配另一个字符串需要进行多少次编辑.或者检查字符串组成的较小序列的NGram算法,并将它们与一个同义词串的序列进行比较.然后有语音算法根据"声音"如何编码字符串.就像SoundEx或Double Metaphone算法

[算法系列之二十六]字符串匹配之KMP算法

一 简介 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的. 二 基于部分匹配表的KMP算法 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含搜索串"ABCDABD"? 步骤1:字符串"BBC ABC

字符串匹配与KMP算法实现

字符串匹配问题 字符串匹配问题即在匹配串中寻找模式串是否出现, 首先想到的是使用暴力破解,也就是Brute Force(BF或蛮力搜索) 算法,将匹配串和模式串左对齐,然后从左向右一个一个进行比较, 如果不成功则模式串向右移动一个单位,直到匹配成功或者到达匹配串最后仍然不成功,返回失败. 很明显,这种算法有很多的地方可以优化,假设要搜索的串为S,长度为n,要匹配的串为M,长度为m,时间复杂度为O(nm). 几个优化的字符串匹配算法 (1)Boyer-Moore算法 (2)Rabin-Karp算法

字符串匹配的KMP算法(转)

字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一.它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth. 这种算法不太容易理解,网上有很多解释,但读起来都很费劲.直到读到Jake Boxer的文章,我才真正理解这种算法.下面,我用自己的语言

java实现字符串匹配求两个字符串的最大公共子串_java

本文实例讲述了java实现求两个字符串最大公共子串的方法.分享给大家供大家参考,具体如下: 最近在项目工作中有一个关于文本对比的需求,经过这段时间的学习,总结了这篇博客内容:求两个字符串的最大公共子串. 算法思想:基于图计算两字符串的公共子串.具体算法思想参照下图: 输入字符串S1:achmacmh    输入字符串S2:macham 第a步,是将字符串s1,s2分别按字节拆分,构成一个二维数组: 二维数组中的值如b所示,比如第一行第一列的值表示字符串s2和s1的第一个字节是否相等,若相等就是1