C++字符串操作:将子串移动到字符串最前端的实现与优化
我来帮你解决这个问题。这是一个字符串操作问题,需要将 `s2` 移动到 `s1` 的最前端。 ## 🎯 问题分析 我们需要: 1. 从 `s1` 中找到 `s2` 的位置 2. 从 `s1` 中移除 `s2` 3. 将 `s2` 添加到 `s1` 的最前面 ## 💻 C++ 实现方案 ### 方案一:使用 `find()` 和 `erase()` 方法(推荐) ```cpp #include <iostream> #include <string> using namespace std; int main() { string s1, s2; // 读取输入 getline(cin, s1); getline(cin, s2); // 查找 s2 在 s1 中的位置 size_t pos = s1.find(s2); // 如果找到了 s2 if (pos != string::npos) { // 从 s1 中移除 s2 s1.erase(pos, s2.length()); // 将 s2 添加到 s1 的最前面 s1 = s2 + s1; } // 如果没找到,s1 保持不变 // 输出结果 cout << s1 << endl; return 0; } ``` ### 方案二:使用子字符串操作 ```cpp #include <iostream> #include <string> using namespace std; int main() { string s1, s2; getline(cin, s1); getline(cin, s2); size_t pos = s1.find(s2); if (pos != string::npos) { // 将 s1 分为三部分:s2 之前的部分 + s2 + s2 之后的部分 string before = s1.substr(0, pos); string after = s1.substr(pos + s2.length()); s1 = s2 + before + after; } cout << s1 << endl; return 0; } ``` ## 📝 代码解释 ### 关键函数说明 | 函数/方法 | 说明 | 返回值 | |-----------|------|--------| | `find()` | 在字符串中查找子串 | 找到返回位置索引,未找到返回 `string::npos` | | `erase()` | 删除字符串的一部分 | 返回修改后的字符串引用 | | `substr()` | 提取子字符串 | 返回新的字符串 | | `string::npos` | 表示未找到的特殊值 | 通常为 `-1` 或最大无符号值 | ### 执行流程 1. **读取输入**:使用 `getline()` 读取整行,可以处理包含空格的字符串 2. **查找位置**:使用 `find()` 查找 `s2` 在 `s1` 中的第一次出现位置 3. **处理结果**: - 如果找到:移除 `s2`,然后将其添加到最前面 - 如果没找到:保持 `s1` 不变 4. **输出结果** ## ⚠️ 注意事项和边界情况 ### 1. 多次出现的情况 题目没有明确说明如果 `s2` 在 `s1` 中出现多次怎么办。上述代码只处理第一次出现的情况。如果需要处理所有出现,需要修改逻辑。 ### 2. 空字符串处理 - 如果 `s2` 是空字符串:`find("")` 会返回 0,需要特殊处理 - 如果 `s1` 是空字符串:正常处理 ### 3. 改进版本(处理空字符串) ```cpp #include <iostream> #include <string> using namespace std; int main() { string s1, s2; getline(cin, s1); getline(cin, s2); // 处理 s2 为空字符串的情况 if (s2.empty()) { cout << s1 << endl; return 0; } size_t pos = s1.find(s2); if (pos != string::npos) { s1.erase(pos, s2.length()); s1 = s2 + s1; } cout << s1 << endl; return 0; } ``` ## 🚀 性能优化建议 ### 时间复杂度 - `find()`:平均 O(n),最坏 O(n×m),其中 n 是 s1 长度,m 是 s2 长度 - `erase()`:O(n),因为可能需要移动后面的字符 - 总体:O(n) 时间复杂度 ### 空间复杂度 - O(1) 额外空间(方案一) - O(n) 额外空间(方案二,因为创建了临时字符串) ## 🔧 扩展功能 ### 1. 处理所有出现的 s2 ```cpp // 移除所有出现的 s2,然后将一个 s2 放到最前面 size_t pos = s1.find(s2); if (pos != string::npos) { // 移除所有 s2 while ((pos = s1.find(s2)) != string::npos) { s1.erase(pos, s2.length()); } // 添加一个 s2 到最前面 s1 = s2 + s1; } ``` ### 2. 大小写不敏感版本 ```cpp #include <algorithm> #include <cctype> // 转换为小写后比较 string toLower(const string& str) { string result = str; transform(result.begin(), result.end(), result.begin(), ::tolower); return result; } // 在查找时使用 string s1_lower = toLower(s1); string s2_lower = toLower(s2); size_t pos = s1_lower.find(s2_lower); ``` ## 📚 学习资源推荐 1. **C++ 字符串操作**: - [C++ string 类文档](https://en.cppreference.com/w/cpp/string/basic_string) - 《C++ Primer》第 9 章:顺序容器 2. **在线练习平台**: - LeetCode:字符串相关题目 - Codeforces:字符串处理问题 ## 💡 开发建议 1. **输入验证**:在实际应用中,应该验证输入的有效性 2. **错误处理**:考虑各种边界情况和异常输入 3. **代码可读性**:使用有意义的变量名,添加必要的注释 4. **测试用例**: ```cpp // 测试用例 // 1. 正常情况 // s1 = "hello world", s2 = "world" → "worldhello " // 2. s2 不在 s1 中 // s1 = "hello", s2 = "world" → "hello" // 3. s2 在 s1 中出现多次 // s1 = "ababab", s2 = "ab" → "ababab"(只移动第一个) // 4. 空字符串 // s1 = "", s2 = "test" → "" // s1 = "test", s2 = "" → "test" ``` 5. **使用现代 C++**:考虑使用 C++17 或 C++20 的特性,如 `string_view` 来避免不必要的拷贝 ######[AI写代码神器 | 1639点数解答 | 2026-04-11 14:48:27]
- Python实现Q老师成绩管理任务:修改与查看学生成绩(字节豆包 | 191点数解答 | 2025-12-20 20:55:41)83
- Python 代码助力 Q 老师高效管理班级学生成绩:修改与查看一键搞定(字节豆包 | 326点数解答 | 2025-12-27 20:48:12)90
- C++ 求解:最少操作次数让字符串无子串 “friend” (字节豆包 | 153点数解答 | 2024-08-17 16:29:54)487
- C++ 求解:最少操作次数让字符串不再含 “friend” 子串!(讯飞星火 | 260点数解答 | 2024-08-17 16:30:49)474
- Python 巧解:最少操作次数让字符串告别“friend”子串(字节豆包 | 139点数解答 | 2024-08-18 13:04:14)412
- 3414 数字游戏:Python 求解 8 位 01 字符串中 1 的个数 (字节豆包 | 106点数解答 | 2024-10-27 14:23:27)438
- 巧用字符添加,计算字符串中“our”最大数量及开发注意要点(DeepSeek | 376点数解答 | 2025-10-30 19:20:06)87
- C 语言实现:处理字符串生成最多 “our” 串,附代码及关键开发注意点 (DeepSeek | 257点数解答 | 2025-10-30 19:20:36)121
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)355
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)327
- 解析React 15与Vue 2:从O(n^3)到O(n),Diff算法时间复杂度计算及性能对比 (阿里通义 | 379点数解答 | 2023-11-09 01:49:19)343
- 缜密逻辑,全新无名杀“风餐”技能代码精心打造与深度解析 (字节豆包 | 469点数解答 | 2025-04-05 11:37:06)251