zoukankan      html  css  js  c++  java
  • 字符串:手写拼接

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

    对于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 } 
  • 相关阅读:
    intellij idea 将taskRequest.java文件识别为文本文档
    react 学习笔记2
    react 学习笔记1
    webpack4 配置笔记(转自掘金)
    音乐播放之进度条-自定义
    EBS
    Python 学习笔记
    Form 电子表格(JTF GRID)
    Form 中实现历史记录查询
    Form 去掉使用格式掩码带来的多余字符
  • 原文地址:https://www.cnblogs.com/aininot260/p/9270899.html
Copyright © 2011-2022 走看看