答案:C++中字符串旋转可通过substr截取拼接实现,如左旋将前n字符移至末尾,示例代码使用substr分两部分重组。

在C++中实现字符串旋转,通常是指将字符串的前n个字符移到末尾,或者将后n个字符移到开头。常见的是左旋操作:比如字符串"abcdef"左旋3位变成"defabc"。下面介绍几种实用的实现方法。
1. 使用substr进行字符串截取
这是最直观的方法,利用std::string的substr()函数将字符串分为两部分,然后重新拼接。
示例代码:
string leftRotate(string s, int n) {if (s.empty() || n n = n % s.length(); // 处理n大于字符串长度的情况
return s.substr(n) + s.substr(0, n);
}
例如,"abcdef"调用leftRotate(s, 3)会返回"defabc"。这种方法简洁易懂,适合大多数场景。
立即学习“C++免费学习笔记(深入)”;
2. 原地旋转(三次翻转法)
如果希望节省空间,可以使用原地算法,通过三次翻转实现左旋效果,时间复杂度O(n),空间复杂度O(1)(对字符数组操作时)。
步骤如下:
- 翻转前n个字符
- 翻转剩余字符
- 翻转整个字符串
示例代码:
void reverse(string& s, int start, int end) {while (start swap(s[start], s[end]);
start++; end--;
}
}
string leftRotateInPlace(string s, int n) {
if (s.empty() || n
int len = s.length();
n = n % len;
reverse(s, 0, n - 1); // 翻转前n个
reverse(s, n, len - 1); // 翻转后面部分
reverse(s, 0, len - 1); // 翻转整体
return s;
}
该方法在处理大字符串或对内存敏感的场景下更有优势。
3. 使用rotate算法(STL)
C++标准库提供了std::rotate,可以直接实现元素旋转。
#includestring leftRotateSTL(string s, int n) {
if (s.empty() || n
n = n % s.length();
std::rotate(s.begin(), s.begin() + n, s.end());
return s;
}
这个方法代码最简洁,且经过优化,性能良好,推荐在支持STL的环境中使用。
基本上就这些常用方法。根据是否需要原地操作、是否追求简洁,可以选择substr拼接、三次翻转或std::rotate。实际应用中注意处理边界情况,如空字符串和n为0或超过长度的情况。不复杂但容易忽略细节。











