【PTA】【数据结构与算法】串与KMP算法

数据结构与算法 专栏收录该内容
30 篇文章 11 订阅

判断题

1. 空串与空格串是相同的。
TF
2.如果一个串中的所有字符均在另一串中出现,则说前者是后者的子串。
TF
3.假设模式串是abababaab,则KMP模式匹配算法中的next[j] = 0 1 1 2 3 4 5 6 2。
TF

选择题

1.若串S=“software”,其子串的数目是
选项
A8
B 37
C36
D9
2.在用KMP算法进行模式匹配时,模式串“ababaaababaa”的next数组值为____。
选项
A-1,0,1,2,3,4,5,6,7,8,9,9
B-1,0,1,2,1,2,1,1,1,1,2,1
C-1,0,0,1,2,3,1,1,2,3,4,5
D-1,0,1,2,3,0,1,2,3,2,2,3
3.如模式串t = “abcabaa”,采用KMP算法或改进的KMP算法进行模式匹配时,next函数值和nextval函数值(下标从0开始)分别为:
选项
Anext={-1,0,0,0,1,2,1}, nextval={-1,-1,-1,-1,1,2,-1}
Bnext={-1,0,0,1,0,2,1}, nextval={-1,0,0,0,1,2,1}
Cnext={-1,0,0,0,1,2,1}, nextval={-1,0,0,-1,1,2,1}
Dnext={-1,0,0,0,1,2,1} , nextval={-1,0,0,-1,0,2,1}
4.已知字符串S为“abaabaabacacaabaabcc”,模式串t为“abaabc”。采用KMP算法进行匹配,第一次出现“失配”(s[i]≠t[j])时,i=j=5,则下次开始匹配时,i和j的值分别是()。
选项
Ai=1,j=0
Bi=5,j=0
Ci=5,j=2
Di=6,j=2

填空题

1.设目标串text=“abccdcdccbaa”,模式串pattern=“cdcc”,若采用BF(Brute Force)算法,则在第 6 趟匹配成功。
2.若n为主串长度,m为模式串长度,采用BF(Brute Force)模式匹配算法,在最坏情况下需要的字符比较次数为 m*(n-m+1)
3.对于模式串“ababaa”,试给出其lps数组和next数组的值。其中lps是最长公共前缀后缀(longest prefix suffix)。(数据间以一个空格分隔,最后一个数后面没有空格)

lps数组 : 0 0 1 2 3 1
next数组:-1 0 0 1 2 3

程序填空题

1.KMP算法。
#include<cstring>
#include<iostream>
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
#define MAXSTRLEN 255 

void get_nextval(char T[], int nextval[])
{ 
	int i = 1, j = 0;
	nextval[1] = 0;
	while (i < T[0])
		if (j == 0 || T[i] == T[j])
		{
			++i;
			++j;
			if (T[i] != T[j])
				nextval[i] = j;
			else
				nextval[i] = nextval[j];
		} else
			j = nextval[j];
}

int Index_KMP(char S[], char T[], int pos, int next[])
{ 
	int i = pos, j = 1;
	while (i <= S[0] && j <= T[0])
		if (j == 0 || S[i] == T[j]) 
		{
			++i;
			++j;
		}
		else
			j = next[j]; 
	if (j > T[0]) 
		return i - T[0];
	else
		return 0;
}

int main()
{
	char S[MAXSTRLEN+1],T[MAXSTRLEN+1];
	char S1[MAXSTRLEN],S2[MAXSTRLEN];
	cin >> S1 >> S2;
	strcpy(&S[1],S1);
	strcpy(&T[1],S2);	
	S[0]=strlen(S1);
	T[0]=strlen(S2);
	int *p = new int[T[0]+1];
	get_nextval(T,p);
	cout<<Index_KMP(S,T,1,p);
	return 0;
}
  • 0
    点赞
  • 0
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值