字符串的简单拼接

校选赛中我出的一道题,放在了第二题的位置,题目的思路来源于在求解单词接龙这道题时,处理单词串拼接时的实现细节,方法有很多,这里介绍一种我想到的。

对于abc和bce,将他们拼在一起形成abcbce,之后去掉中间重叠的部分,就变成了abce,编程完成这一细节实现。

我们首先建立两个空子串,然后存一下两个串的长度的最小值,然后设置两个指针,一个枚举第一个字符串中的每一个字符,从后往前枚举,一个枚举第二个字符串中的每一个字符,从前往后枚举

    for(int i=0;i<len;i++)
    {
        c=a[len1-i-1]+c;
        d=d+b[i];
        if(c==d)
            tmp=c;
    }

看上述代码,每枚举到一个字符,就将其与空字符串连接,一个一个字符地去加。

每次加都判断一下当前两个新字符串是否相等,如果相等就把相等的这个结果存下来。

找完之后,我们将第一个字符串的后半部分去掉,去掉多少呢?就去掉之前存下来的结果的长度。同理,我们把第二个字符串的前半部分去掉,同样也去掉当前那个临时存下的结果的长度。

len=tmp.size();
    for(int i=0;i<len1-len;i++)
        ans=ans+a[i];
    for(int i=0;i<len;i++)
        ans=ans+tmp[i];
    for(int i=len;i<len2;i++)
        ans=ans+b[i];

我们的结果就变成了第一个字符串的前半部分+重叠部分(临时存下的结果)+第二个字符串的后半部分

完整的实现代码如下:

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 string a,b;
 5 int MIN(int x,int y)
 6 {
 7     return x<y?x:y;
 8 }
 9 int main()
10 {
11     cin>>a>>b;
12     int len1=a.size();
13     int len2=b.size();
14     string c="",d="";
15     int len=MIN(len1,len2);
16     string tmp="";
17     string ans="";
18     for(int i=0;i<len;i++)
19     {
20         c=a[len1-i-1]+c;
21         d=d+b[i];
22         if(c==d)
23             tmp=c;
24     }
25     len=tmp.size();
26     for(int i=0;i<len1-len;i++)
27         ans=ans+a[i];
28     for(int i=0;i<len;i++)
29         ans=ans+tmp[i];
30     for(int i=len;i<len2;i++)
31         ans=ans+b[i];
32     cout<<ans;
33     return 0;
34 } 

猜你喜欢

转载自www.cnblogs.com/aininot260/p/9270899.html