2 条题解
-
0
解题思路:
本题要求实现一个基于规则的单行文本替换引擎。给定一组规则(查找字符串和替换字符串),按顺序对文本应用规则: 对当前规则,从文本开头搜索第一个匹配项 替换后立即重新从头搜索(可能产生新匹配) 当无匹配时,切换到下一条规则 所有规则只应用一次且按顺序执行
关键步骤:
1.输入处理:
读取规则数量 ,使用 安全读取规则和文本 移除输入中的换行符
2.规则应用:
按顺序遍历每条规则,使用 查找第一个匹配项,通过字符串拼接实现替换,匹配后重置搜索位置(从头开始)
3.输出结果:
应用所有规则后输出最终文本
C++实现
#include <bits/stdc++.h> using namespace std; int n; char a[105][105]; // 存储查找字符串 char b[105][105]; // 存储替换字符串 char sb[305]; // 存储文本(初始≤80,处理中≤255) // 移除字符串末尾的换行符 void remove_newline(char *str) { int len = strlen(str); if (len > 0 && str[len - 1] == '\n') { str[len - 1] = '\0'; } } int main() { // 循环处理每个测试用例,直到遇到0 while (scanf("%d", &n) != EOF && n) { // 清除输入缓冲区的换行符 while (getchar() != '\n'); // 读取规则:每条规则包含查找串和替换串 for (int i = 0; i < n; i++) { fgets(a[i], sizeof(a[i]), stdin); // 安全读取查找串 remove_newline(a[i]); // 移除换行符 fgets(b[i], sizeof(b[i]), stdin); // 安全读取替换串 remove_newline(b[i]); // 移除换行符 } // 读取待处理文本 fgets(sb, sizeof(sb), stdin); remove_newline(sb); // 按顺序应用每条规则 for (int i = 0; i < n; i++) { char *p; // 指向匹配位置的指针 // 持续替换直到无匹配 while ((p = strstr(sb, a[i])) != NULL) { char temp[305]; // 临时存储匹配后的内容 // 1. 保存匹配位置之后的内容 strcpy(temp, p + strlen(a[i])); // 2. 将替换字符串复制到匹配位置 strcpy(p, b[i]); // 3. 将剩余内容追加到替换串后 strcpy(p + strlen(b[i]), temp); // 替换后重置搜索位置(从文本开头重新搜索) } } // 输出处理后的文本 printf("%s\n", sb); } return 0; }
-
0
#include <iostream> #include <vector> #include <string> using namespace std; int main() { int n; while (cin >> n && n != 0) { cin.ignore(); vector<pair<string, string> > rules; for (int i = 0; i < n; ++i) { string find, replace; getline(cin, find); getline(cin, replace); rules.push_back(make_pair(find, replace)); } string text; getline(cin, text); for (int i = 0; i < rules.size(); ++i) { string find = rules[i].first; string replace = rules[i].second; size_t pos; while ((pos = text.find(find)) != string::npos) { text = text.substr(0, pos) + replace + text.substr(pos + find.size()); } } cout << text << endl; } return 0; }
- 1
信息
- ID
- 573
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 13
- 已通过
- 1
- 上传者