hihoCoder Problem 1082: 然而沼跃鱼早就看穿了一切 | 本站已迁移到www.code.bitjoy.net
替换可以分如下几步:
http://www.cnblogs.com/boring09/p/4355969.html
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
简单的字符串查找替换题目。需要把字符串"marshtomp"替换成"fjxmlhx",而且marshtomp是不论大小写都要替换的,即使是嵌在一个长的单词内部也要替换,比如第三个样例。输入
输入包括多行。
每行是一个字符串,长度不超过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
替换可以分如下几步:
- 首先判断一个单词的长度是否大于等于marshtomp的长度,如果小于,肯定不要替换;否则转2
- 将该单词转换成小写形式(使用cctype的tolower(int)库函数)
- 查找单词中是否有marshtomp部分存在(使用string.find)
- 如果存在,则把marshtomp替换成fjxmlhx,并且拼接剩余部分
- 将所有单词组成一个句子输出
getline
输入并判断输入是否为空
|
字符串匹配+替换
注意替换串和原串长度是不等的,所以替换完还要进行收缩
6 void kmp(char *line, int len) { 7 char p[] = "marshtomp"; 8 char t[] = "fjxmlhx"; 9 int next[10] = {-1, 0, 0, 0, 0, 0, 0, 0, 1, 0}; 10 int i = 0; 11 int j = 0; 12 13 while (i < len && j < 9) { 14 if (j < 0 || tolower(line[i]) == p[j]) { 15 i++; 16 j++; 17 } 18 else 19 j = next[j]; 20 if (j == 9) { 21 memcpy(line + i - 9, t, 7); 22 line[i - 9 + 7] = 0; 23 line[i - 9 + 8] = 0; 24 j = 0; 25 } 26 } 27 } 28 29 void shrimp(char *line, int len) { 30 int i = 0; 31 int j = 0; 32 33 while (j < len) { 34 if (line[j] == 0) 35 j++; 36 else 37 line[i++] = line[j++]; 38 } 39 line[i] = 0; 40 } 41 42 int main() { 43 char line[256]; 44 45 while (gets(line)) { 46 int len = strlen(line); 47 kmp(line, len); 48 shrimp(line, len); 49 cout << line << endl; 50 } 51 52 return 0; 53 }Read full article from hihoCoder Problem 1082: 然而沼跃鱼早就看穿了一切 | 本站已迁移到www.code.bitjoy.net