酷代码 AI
菜单
服务商

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]

相关提问
本站限时免费提问中
实用工具查看更多
Linux在线手册 [开发类]
Jquery在线手册 [开发类]
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]