#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
char out[50];
vector<string> re;
int longestSubstring1(string x, string y,int &start) {
int xlen = x.size();
int ylen = y.size();
if (xlen == 0 || ylen == 0) {
return 0;
}
int max = -1;
//暴力破解法,两重for循环加 while
for (int i = 0; i < xlen; i++) {
for (int j = 0; j < ylen; j++) {
int m = i, n = j;
int len = 0;
while (m < xlen && n < ylen) {
if (x[m] != y[n]) {
break;
}
m++;
n++;
len++;
}
if (len > max) {
max = len;
start = i;
}
}
}
return max;
}
//动态规划
int longestSubstring2(string x, string y,int &start) {
//设置dp数组
vector<vector<int> > f(x.size() + 1, vector<int>(y.size() + 1, 0));
//vector< vector<int> > f;
int max = -1;
for (int i = 1; i <= x.size(); i++) {
for (int j = 1; j <= y.size(); j++) {
if (x[i - 1] != y[j - 1]) f[i][j] = 0;
else if (x[i - 1] == y[j - 1]) f[i][j] = f[i - 1][j - 1] + 1;
if (max < f[i][j]) {
max = f[i][j];
start = i;
}
}
}
return max;
}
int main()
{
string x = "adbccadbxadebbca";
string y = "bcadrbxad";
int start;
int out =longestSubstring1 (x,y,start);
cout << out << "-" << start << endl;
for (int i=0; i<out ;++i)
cout << x[start + i];
cout << endl;
#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 =i-k+1;
}
}
}
cout << first << "-" << 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;
}
}
}
}
}
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;