字符串的簡單拼接
阿新 • • 發佈:2018-07-06
return stream 們的 style 去掉 div 目的 ostream 臨時
校選賽中我出的一道題,放在了第二題的位置,題目的思路來源於在求解單詞接龍這道題時,處理單詞串拼接時的實現細節,方法有很多,這裏介紹一種我想到的。
對於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 { 11cin>>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 }
字符串的簡單拼接