2 条题解

  • 0
    @ 2025-5-28 22:43:01

    解题思路:

    本题要求实现一个基于规则的单行文本替换引擎。给定一组规则(查找字符串和替换字符串),按顺序对文本应用规则: 对当前规则,从文本开头搜索第一个匹配项 替换后立即重新从头搜索(可能产生新匹配) 当无匹配时,切换到下一条规则 所有规则只应用一次且按顺序执行

    关键步骤:

    1.输入处理:

    读取规则数量 nn,使用 fgetsfgets 安全读取规则和文本 移除输入中的换行符

    2.规则应用:

    按顺序遍历每条规则,使用 strstrstrstr 查找第一个匹配项,通过字符串拼接实现替换,匹配后重置搜索位置(从头开始)

    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
      @ 2025-5-5 12:44:24
      #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
      上传者