输入字符串,找出相同且长度最长的子字符串,输出

本文详细介绍了从最长字符串开始查找的算法步骤,包括如何通过长度递减的方式逐个检查子字符串,并利用子字符串的首位置和末位置来判断其在原始字符串中的唯一性。该算法适用于字符串匹配和文本搜索任务。

从最长的字符串开始找,设len为字符串长度,

步骤1、长度为len的字符串,L=len

步骤2、长度为len-1的字符串,L=len-1

步骤3、长度为len-2的字符串,L=len-2

....

步骤L、长度为L的字符串

.....

步骤len、长度为1的字符串,L=1

设置一个变量i,用来指示子字符串的首位置,子字符串的范围为 :i—i+L-1,i取值从0到len-L+1

#include <iostream>

#include <string>


using namespace std;




void main()
{
string str,tmp;
cout<<"输入字符串"<<endl;
cin>>str;


int len=str.length();
int L=len;
int i=0;
int f,b;
while(L>0)
{
for(i=0;i+L-1<len;i++)
{
tmp=str.substr(i,i+L-1);
f=str.find(tmp);
b=str.rfind(tmp);
if(f!=b)
{
cout<<tmp<<' '<<i<<endl;
L=0;//结束
break;
}
}
L--;
}




system("pause");
}
在C语言中,我们可以使用指针、循环以及动态内存分配来实现这个功能。首先,让用户分别输入两串字符串,然后逐字符比较它们。如果找到相同的字符,我们会记录下当前匹配的子串,并继续扩展直到遇到不同的字符或到达字符串结束。这里是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 函数返回两个字符串之间的最长连续重复子串 char* longest_common_substring(char* str1, char* str2) { int len1 = strlen(str1); int len2 = strlen(str2); int max_len = 0; int end_index = -1; // 每次比较从第一个字符开始 for (int i = 0; i <= len1 && i <= len2; ++i) { // 如果当前字符相同 if (str1[i] == str2[i]) { // 更新最长子串长度和结束位置 if (max_len == 0 || i - start_pos == max_len - 1) { start_pos = i; max_len = 1; } else { max_len++; } } else { // 遇到不同字符,检查是否是最长重复子串 if (max_len > end_index + 1) { end_index = i - 1; } max_len = 0; // 重置计数 start_pos = -1; // 重置起始位置 } } // 如果找到了重复子串,动态分配并复制结果 if (end_index != - start_pos + 1) * sizeof(char)); strncpy(result, &str1[start_pos], end_index - start_pos + 1); result[end_index - start_pos + 1] = '\0'; // 添加终止符 return result; } else { return NULL; // 没有找到重复子串 } } int main() { char str1[100]; char str2[100]; printf("请输入第一串字符串: "); fgets(str1, sizeof(str1), stdin); // 去除换行符 str1[strlen(str1) - 1] = '\0'; printf("请输入第二串字符串: "); fgets(str2, sizeof(str2), stdin); str2[strlen(str2) - 1] = '\0'; char* longest = longest_common_substring(str1, str2); if (longest) { printf("最长连续重复子串是: %s\n", longest); } else { printf("未找到连续重复子串。\n"); } free(longest); // 释放动态分配的内存 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值