GEEK编程练习— —最长相同的子串

题目

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

输入

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;
}

你可能感兴趣的:(C++)