字符串:手写拼接
校选赛中我出的一道题,放在了第二题的位置,题目的思路来源于在求解单词接龙这道题时,处理单词串拼接时的实现细节,方法有很多,这里介绍一种我想到的。
对于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 }