两个子串

两个子串

http://www.nowcoder.com/questionTerminal/abf0f0d6b4c44676b44e66060286c45a

题解

难度:简单

知识点:字符串

整道题主要考察的就是字符串的知识和一些字符串函数,整体思路比较简单。现提供两种算法思路来解决问题。
解题思路:因为要求输出的字符串要含有两个输入的字符子串,并且要求是最短的,那肯定是重复的部分越多越好,这样整个字符串就会越短。所以越早发现重复部分,结果越短。

方法一:

使用for循环,检查一下子从什么flag位置开始,后面的所有字符都可以从头匹配得到,此时这个位置的就是最近的,组合得到的字符即是最短的。

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string str;
    cin>>str;
    int len=str.size();
    int flag = 0;
    for(int i=1;i<len;i++)
     {
        int k=i;
        for(int j=0;j<len;j++)
        {
            if(str[j]==str[k])
            {
                k++;
            }
            else
            {
                break;
            }
            if(k==len)
            {
                flag=i;
                break;
            }
        }
        if(flag)
            break;
    }
    if(flag)
    {
        for(int i=0;i<flag;i++)
        {
            cout<<str[i];
        }
        cout<<str<<endl;
    }
    else
        cout<<str<<str<<endl;
    return 0;
}

方法二

因为拼合成的字符含有两个输入的子字符串,所以加入我们用两个这个字符串拼成一个字符,然后将不重合的部分删除掉即可以找到最多的相同部分,然后再在两个相同字符串的基础上删除掉这部分,即可得到所求的字符串。但是如何删除呢?此时就可以联想到,一个是需要重头部开始删除,另一个则从尾删除,直到剩下的部分相同为止。

#include <iostream>
#include <string>
using namespace std;
string eraseMore(string str)
{
    string str1(str),str2(str),str3(str);
    int length=str.length();
    int i=1;
    for( i; i<length; i++)
    {
        str1.erase(0,1);
        str2.erase(str2.length()-1,1);
        if(str1==str2)
            break;
    }
    return str+str3.erase(0,str3.length()-i);
}
int main()
{
    string str;
    cin>>str;
    cout << eraseMore(str)<< endl;
    return 0;
}
全部评论

相关推荐

ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务