求一个串中出现的第一个最长重复字串
目的:掌握串的模式匹配应用算法设计。
内容:采用顺序结构存储串,编写一个程序,利用简单模式匹配方法求串s中出现的第一个最长重复子串的下标和长度。
程序代码
void MaxStr(char* Str, int& i, int& j)
{
int idx, max = 1; //idx为当前扫描到的下标,max为当前扫描的长度
char c = Str[0];
i = 0; j = 1; //i为起始下标,j为当前最大子串长度
for (idx = 1; Str[idx] != '\0'; idx++) {
if (c == Str[idx]) //当字符串连续相同时记录长度
max++;
else if (max > j) { //当当前连续子串比最长子串要长时,改变i和j的值
i = idx - max;
j = max;
max = 1;
}
else { //否则清空长度
max = 1;
}
c = Str[idx];
}
if (max > j) { //判断最后一个连续串
i = idx - max;
j = max;
}
}
代入主函数
#include<stdio.h>
#define Max 9999
void MaxStr(char*, int&, int&);
int main(int argc, const char* argv[])
{
char Str[Max];
int i, j;
printf("请输入一个只包含英文字母的字符串:");
scanf_s("%s", Str, Max);
MaxStr(Str, i, j);
printf("字符串中出现的第一个最长重复子串的下标和长度为:%d、%d。\n\n", i, j);
return 0;
}
void MaxStr(char* Str, int& i, int& j)
{
int idx, max = 1; //idx为当前扫描到的下标,max为当前扫描的长度
char c = Str[0];
i = 0; j = 1; //i为起始下标,j为当前最大子串长度
for (idx = 1; Str[idx] != '\0'; idx++) {
if (c == Str[idx]) //当字符串连续相同时记录长度
max++;
else if (max > j) { //当当前连续子串比最长子串要长时,改变i和j的值
i = idx - max;
j = max;
max = 1;
}
else { //否则清空长度
max = 1;
}
c = Str[idx];
}
if (max > j) { //判断最后一个连续串
i = idx - max;
j = max;
}
}