题目
输入一行字符串,找出其中出现的相同且长度最长的字符串,输出它及首字符的位置。
输入
yyabcdabjcabceg
输出
abc
3
解析
首先声明一下,假如字符串为aaaaaa,答案应该为aaaaa。两个个等长的子串可以有部分字符重叠。
以abcab为例子分析如下:
首先寻找长度为4的子串,只能是abca和bcab,再查看这两个子串是否有其他相同的子串。有的话直接输出结果并退出程序。
然后寻找长度为3的子串,只能abc,bca,cab。这3个子串都没有其他相同的子串。
最后寻找长度为2的子串,首先是ab,用find函数返回在abcab中正序查找的位置0,用rfind函数返回在abcab中逆序查找的位置3。这两个位置不相等,说明在不同的位置存在相同的子串ab。
代码
#include <iostream>
using namespace std;
pair<int,string> fun(const string &str)
{
int count = 0;
string substrs, tep;
int i, j, len = str.length();
for(i = len - 1; i >= 1; --i)
{
for(j = 0; j <= len - i; j++)
{
size_t t = 0;
size_t num = 0;
tep = str.substr(j,i);
t = str.find(tep);
num = str.rfind(tep);
if(t != num)
{
count = t + 1;
substrs = tep;
return make_pair(count, substrs);
}
}
}
return make_pair(count, substrs);
}
int main()
{
string str;
pair<int,string> rs;
cin >> str;
rs = fun(str);
cout << rs.second << endl << rs.first << endl;
return 0;
}
时间: 2024-11-05 12:16:48