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

判断题

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

选择题

1.若串S=“software”,其子串的数目是
选项
A 8
B 37
C 36
D 9
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开始)分别为:
选项
A next={-1,0,0,0,1,2,1}, nextval={-1,-1,-1,-1,1,2,-1}
B next={-1,0,0,1,0,2,1}, nextval={-1,0,0,0,1,2,1}
C next={-1,0,0,0,1,2,1}, nextval={-1,0,0,-1,1,2,1}
D next={-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的值分别是()。
选项
A i=1,j=0
B i=5,j=0
C i=5,j=2
D i=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
#include
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;
}

你可能感兴趣的:(#,数据结构与算法)