华为机试——字符串中出现相同最长字符串

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

例如“yyabcdabjcabceg”,输出结果应该为abc和3,

原理:查找的最长子串长度从length()-1开始,i为子串的长度,j为子串的起始位置,通过正序和逆序查找比较看子串是否重复出现在字符串中不同位置来找到最长的重复子串

#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);//从大到小取子串
                t=str.find(tep);//正序查找
                num=str.rfind(tep);//逆序查找
                if(t!=num)  //如果两次查找位置不一致说明存在重复子串
                {
                    cout<<tep<<" "<<t+1<<endl; //输出子串及位置
                    return 0;
                }
            }

        }
    }
        return 0;
}