从原字符串中提取索引i到j的子串,将其插入到位置k(k不能在被剪切区间内)。通过边界检查确保索引有效,删除原区间后根据k的位置调整插入点,最终返回新字符串
#include <string> #include <stdexcept> std::string cutAndPaste(const std::string& original, size_t i, size_t j, size_t k) { if (i > j || j >= original.size() || k >= original.size()) { throw std::out_of_range("索引越界"); } if (k >= i && k <= j) { throw std::invalid_argument("k 不能位于被剪切的区间内"); } // 1. 提取子串(从 i 到 j,共 j - i + 1 个字符) std::string sub = original.substr(i, j - i + 1); // 2. 复制原字符串并删除该子串 std::string result = original; result.erase(i, j - i + 1); // 3. 计算插入位置(在删除后的字符串中) size_t insertPos; if (k < i) { // k 在剪切区间之前,删除不影响 k 的位置 insertPos = k + 1; // 第 k 位后面就是索引 k+1 } else { // k > j // k 在剪切区间之后,删除后 k 的位置向前移动了子串长度 size_t len = j - i + 1; insertPos = k - len + 1; // 原来第 k 位后面,现在索引变为 k - len + 1 } // 4. 插入 result.insert(insertPos, sub); return result; }