然而沼躍魚早已看穿了一切——字串替換
時間限制:1000ms
單點時限:1000ms
記憶體限制:256MB
描述
marshtomp.jpg
fjxmlhx每天都在被沼躍魚刷屏,因此他急切的找到了你希望你寫一個程式遮蔽所有句子中的沼躍魚(“marshtomp”,不區分大小寫)。為了使句子不缺少成分,統一換成 “fjxmlhx” 。
輸入
輸入包括多行。
每行是一個字串,長度不超過200。
一行的末尾與下一行的開頭沒有關係。
輸出
輸出包含多行,為輸入按照描述中變換的結果。
樣例輸入
The Marshtomp has seen it all before.
marshTomp is beaten by fjxmlhx!
AmarshtompB
樣例輸出
The fjxmlhx has seen it all before.
fjxmlhx is beaten by fjxmlhx!
AfjxmlhxB
想法:1.大小寫要考慮;準備兩個s,一個全轉化為小寫字母后再在另一個字串中替換。
2.替換後有縮排,一個句子中可能出現多個‘marshtomp’
方法一:
#include<iostream>
#include<string>
using namespace std;
void replace(string s){
if(s.size()<=0)
return;
int len = s.size();
string s1 = s;
for(int i = 0; i<len; i++)
{
s[i] = tolower (s[i]);
}
int t = 0;
int count = 0;
int j = 0;
while(t>=0){
count++;
t = s.find("marshtomp",j);
if(t == string::npos){
break;
}
j = t+9;
s1.replace(t-2*(count-1),9,"fjxmlhx");
}
cout<<s1<<endl;
}
int main(){
string str;
while(getline(cin,str)){//
replace(str);
}
}
方法二:
#include<iostream>
#include<string>
#include<cctype>
#include<algorithm>
using namespace std;
int main(){
string s,s1;
while(getline(cin,s)){
if(s.size()<= 0){
return 0;
}
s1 = s;
int len = s.size();
//cout<<s<<endl;
for(int i = 0; i<s.size(); i++){
s[i] = tolower(s[i]);
}
//cout<<s<<endl;
//transform(s.begin(),s.end(),s.begin(),::tolower);
int count = 0;
int t = s.find("marshtomp");
//cout<<"finding t"<<t<<endl;
while(t>=0){ //尼瑪這裡-1也是不為空的啊,不要以為-1就是>0就不滿足while(t)
count ++;
int i = t-2*(count-1);
int j = t+9;
s1[i] = 'f';
s1[i+1] = 'j';
s1[i+2] = 'x';
s1[i+3] = 'm';
s1[i+4] = 'l';
s1[i+5] = 'h';
s1[i+6] = 'x';
//cout<<s<<endl;
t = s.find("marshtomp",j);
//cout<<t<<endl;
//system("pause");
if(t == -1){
while(j<len){
s1[j-2*count] = s1[j];
//cout<<j-2*count<<"="<<s[j-2*count]<<j<< "="<< s[j]<<endl;
j++;
}
s1[j-2*count] = '\0';
}else{
while(j<t){
s1[j-2*count] = s1[j];
j++;
}
//continue;
}
}
cout<<s1.substr(0,len-2*count)<<endl;
}
}
這個可以用C++中的string型別的內建函式,replace(),它替換完成後可以自動進行縮排,但是有兩點要注意,一個是輸入問題,之前用的是while(cin>>str),這樣寫的話,加入輸入樣例是“The marshtomp has seen it all before”,會被當成幾個單詞一次處理而不是一句話,難怪之前一直輸出沒有空格。正確的應該是getline(cin,str),才是輸入一個句子當成一個完整的字串。第二個問題是要考慮縮排後再替換的起始位置。
如果不用string的replace函式,那麼就像劍指offer中的空格替換成’%20’一樣,先計算一下縮排,再替換。