使用計(jì)算機(jī)進(jìn)行文本編輯時(shí)常見的功能是剪切功能(快捷鍵:Ctrl + X)。請(qǐng)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的具有剪切和粘貼功能的文本編輯工具。
工具需要完成一系列剪切后粘貼的操作,每次操作分為兩步:
- 剪切:給定需操作的起始位置和結(jié)束位置,將當(dāng)前字符串中起始位置到結(jié)束位置部分的字符串放入剪貼板中,并刪除當(dāng)前字符串對(duì)應(yīng)位置的內(nèi)容。例如,當(dāng)前字符串為?
abcdefg
,起始位置為 3,結(jié)束位置為 5,則剪貼操作后, 剪貼板內(nèi)容為?cde
,操作后字符串變?yōu)?abfg
。字符串位置從 1 開始編號(hào)。 - 粘貼:給定插入位置的前后字符串,尋找到插入位置,將剪貼板內(nèi)容插入到位置中,并清除剪貼板內(nèi)容。例如,對(duì)于上面操作后的結(jié)果,給定插入位置前為?
bf
,插入位置后為?g
,則插入后變?yōu)?abfcdeg
。如找不到應(yīng)該插入的位置,則直接將插入位置設(shè)置為字符串最后,仍然完成插入操作。查找字符串時(shí)區(qū)分大小寫。
每次操作后的字符串即為新的當(dāng)前字符串。在若干次操作后,請(qǐng)給出最后的編輯結(jié)果。
輸入格式:
輸入第一行是一個(gè)長(zhǎng)度小于等于 200 的字符串?S,表示原始字符串。字符串只包含所有可見 ASCII 字符,不包含回車與空格。
第二行是一個(gè)正整數(shù)?N?(1≤N≤100),表示要進(jìn)行的操作次數(shù)。
接下來的?N?行,每行是兩個(gè)數(shù)字和兩個(gè)長(zhǎng)度不大于 5?的不包含空格的非空字符串,前兩個(gè)數(shù)字表示需要剪切的位置,后兩個(gè)字符串表示插入位置前和后的字符串,用一個(gè)空格隔開。如果有多個(gè)可插入的位置,選擇最靠近當(dāng)前操作字符串開頭的一個(gè)。
剪切的位置保證總是合法的。
輸出格式:
輸出一行,表示操作后的字符串。
輸入樣例:
AcrosstheGreatWall,wecanreacheverycornerintheworld
5
10 18 ery cor
32 40 , we
1 6 tW all
14 18 rnerr eache
1 1 e r
輸出樣例:
he,allcornetrrwecaneacheveryGreatWintheworldAcross
?刷pta的題目才發(fā)現(xiàn)刷一道綜合一點(diǎn)的題目真的可以抵好多道那種字符串的問題了,通過理解題目得到大概的思路其實(shí)并不難,這題的題目意思就是復(fù)制一個(gè)字符串的子串然后刪除粘貼到某一位置,只是把這個(gè)過程重復(fù)多次而已。
因此我們可以把難點(diǎn)歸類一下
1.怎么得到剪切(即刪除)后的字符串?
2.怎么找到需要粘貼的位置?這里給了粘貼后前面的字符串和后面的字符串,長(zhǎng)度不大于五,可能也是比較難突破的一個(gè)點(diǎn)了
3.怎么把字符串粘貼到2找到的位置回去?
這題目其實(shí)就是難在這三個(gè)點(diǎn),其實(shí)這就是平時(shí)刷的一些字符串的問題只是綜合在一起考了,這里我們一個(gè)點(diǎn)一個(gè)點(diǎn)來突破
首先就是難點(diǎn)1,怎么得到剪切后的原字符串,其實(shí)化為一個(gè)字符串問題就是一個(gè)刪除子字符串問題,但這畢竟只是一個(gè)小點(diǎn),花太多時(shí)間在這里很浪費(fèi),因此我們可以直接使用erase函數(shù),即原字符串.erase(開始刪除字符的下標(biāo),要?jiǎng)h除的長(zhǎng)度),這個(gè)函數(shù)可以直接套用得到刪除后的字符串,字符串長(zhǎng)度也會(huì)自動(dòng)跟著變化,例如
?
其次就是難點(diǎn)二,也是這題最難的一個(gè)點(diǎn),怎么找到要從哪里開始加入剪切的字符串呢?題目給出了加入前后的字符串來讓我們找位置,假設(shè)找得到的話,那么在粘貼之前題目給出的前后字符串一定是連在一起的,我們就可以直接找他們連起來后在原字符串里有沒有哪段出現(xiàn),如果出現(xiàn)了就說明找到了?,這里可以用第二個(gè)函數(shù)即find函數(shù),可以直接在原字符串里找到子字符串開始出現(xiàn)的位置,沒找到則返回-1,而且也是先找的前面的位置剛好滿足題意,函數(shù)原型為 字符串.find(子字符串),使用如下圖
最后就是難點(diǎn)三的突破了,怎么把找到的字符串粘貼回去,這里就要用到本題的第三個(gè)函數(shù)了,即insert函數(shù),可以直接在某個(gè)位置插入字符串并且也是自動(dòng)改變字符串的長(zhǎng)度,哈哈哈哈就是這么爽,可以直接用,函數(shù)原型為字符串.insert(要插入的位置,插入的字符串)?,使用樣例如下
看到了嗎三個(gè)難點(diǎn)都有三個(gè)函數(shù)可以解決還不直接記!!只要知道函數(shù)這題就很簡(jiǎn)單也可以很快地寫,與其一個(gè)一個(gè)去寫那么多不如一個(gè)函數(shù)方便快捷,考場(chǎng)時(shí)間把握很重要,不過記得在使用前都要在前面加上頭文件#include<string>,下面就直接給出整個(gè)一個(gè)代碼了
代碼如下:文章來源:http://www.zghlxwxcb.cn/news/detail-838949.html
#include<iostream>
#include<string>
using namespace std;
string s;
//得到復(fù)制的字符串
string fff(int a, int b) {
string m;
for (int i = a-1; i < b; i++) m += s[i];
return m;
}
void zhantie(string a, string b, string c) {
string m = b + c;
//假如找到了可以插入的位置
int t = s.find(m);
if (t >= 0) {
s.insert(t + b.size(), a);
}
//假如原字符串沒有可以插入的位置,直接插到最后面
else {
s.insert(s.size(), a);
}
}
int main()
{
getline(cin, s);
int k;
cin >> k;
while (k--) {
int begin, end;
string qian, hou;
cin >> begin >> end >> qian >> hou;
string fuzhi = fff(begin, end);
s.erase(begin-1,end-begin+1);//刪除原字符串剪切完的字符串
zhantie(fuzhi, qian, hou);//得到粘貼后的字符串
}
cout << s << endl;
return 0;
}
后面補(bǔ)充個(gè)小細(xì)節(jié)就是find函數(shù)假如沒找到,直接使用find(m)會(huì)返回一個(gè)很大的值,而不是-1,因此這代碼用了int t來特意接受find后的值,沒找到就會(huì)返回-1文章來源地址http://www.zghlxwxcb.cn/news/detail-838949.html
到了這里,關(guān)于剪切粘貼(pta團(tuán)體天梯題)c++超簡(jiǎn)單詳細(xì)刨析版的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!