找出字符串的重复子串

例如输入qweabcuwabcfw,输出结果为:重复字符串的长度3和位置4

 第一种解法:以字符串的长度为外循环,内循环从字符串的第一个元素开始向后移动。

#include<iostream>
#include<string>
using namespace std;
int main()
{
string str, tep;
cout << "输入字符串" << endl;
cin >> str;
cout <<str.size()<<endl;
int mysize = str.size();
	int k =0;
	int max =0;
	int first;
for (int i = 1; i <mysize; i++)
{
for (int j = 0; j < mysize-i; j++)
{
	if (str[j]==str[j+i])
	{
		k++;
	}
	else
	{
		k=0;
	}
	if(k>max)
   {
	 max = k;
		first =j -k +1;
	}
}
}
	cout << max <<endl;
return 0;

}
 
 

第二种解法

题目:输入一行字符串。找出当中出现的同样且长度最长的字符串,输出它及其首字符的位置。

               比如:“yyabcdabjcabceg",输出结果应该为abc 和3.


这里把子串从大到小排列,第一个满足条件的结果就是所求的最长子串

#include<iostream>
#include<string>
using namespace std;
int main()
{
string str, tep;
cout << "输入字符串" << endl;
cin >> str;
for (int i = str.length() - 1; i > 1; i--)
{
for (int j = 0; j < str.length(); j++)
{
if (j + i <= str.length())
{
size_t t = 0;
size_t num = 0;
tep = str.substr(j, i);//从大到小取子串,从j位置开始取长度为i的子串
t = str.find(tep);//正序查找
num = str.rfind(tep);//逆序查找
if (t != num)//假设两次查找位置不一致,说明存在反复子串
{
cout << tep << " " << t + 1 << endl;//输出子串及位置
system("pause");
return 0;


}
}
}
}
}




























猜你喜欢

转载自blog.csdn.net/runner668/article/details/80783364
今日推荐