C++程序 左旋和右旋字符串
在开发中经常需要对字符串进行操作,其中左旋和右旋字符串操作也是常用的操作之一。左旋字符串是将前面的若干个字符转移到字符串的尾部,右旋字符串则是将字符串的尾部若干字符转移到字符串的头部。C++语言提供了一些字符串操作函数,但是这两种操作并不直接提供函数。本文将介绍如何使用C++语言实现字符串的左旋和右旋操作。
左旋字符串
左旋字符串的实现主要通过翻转字符串的两个部分来实现。比如,对于字符串abcdefg
和左旋2步,我们可以先翻转字符串前两个字符ab
和后面的所有字符cdefg
,得到字符串bagfedc
,然后再翻转整个字符串,得到结果cdefgab
。
以下为左旋字符串的C++实现代码:
#include <iostream>
#include <string>
using namespace std;
// 翻转字符串中[start, end]部分
void reverse(string& str, int start, int end) {
while (start < end) {
swap(str[start], str[end]);
start++;
end--;
}
}
// 字符串左旋k步
string leftRotateString(string str, int k) {
int len = str.size();
// 每次将前k个字符翻转到字符串末尾
reverse(str, 0, k-1);
reverse(str, k, len-1);
// 整个字符串翻转
reverse(str, 0, len-1);
return str;
}
int main() {
string str = "abcdefg";
int k = 2;
string res = leftRotateString(str, k);
cout << "左旋 " << k << " 步后:" << res << endl;
return 0;
}
上述代码中,我们首先定义了一个函数reverse
来翻转字符串中指定部分,然后使用该函数实现了字符串左旋函数leftRotateString
。在函数中,我们分别翻转前k个字符和剩余字符,然后再翻转整个字符串。最后,我们将结果返回。在主函数中,我们使用字符串abcdefg
,并左旋2步,输出结果为cdefgab
。
右旋字符串
右旋字符串可以通过左旋字符串‘string.size()-k’步来实现。比如,对于字符串abcdefg
和右旋2步,我们可以先计算需要左旋的步数为string.size()-2
,然后再调用左旋函数即可。
以下为右旋字符串的C++实现代码:
#include <iostream>
#include <string>
using namespace std;
// 翻转字符串中[start, end]部分
void reverse(string& str, int start, int end) {
while (start < end) {
swap(str[start], str[end]);
start++;
end--;
}
}
// 字符串右旋k步
string rightRotateString(string str, int k) {
int len = str.size();
int left = len-k%len; // 需要左旋的步数
// 翻转前left个字符和剩余字符
reverse(str, 0, left-1);
reverse(str, left, len-1);
// 整个字符串翻转
reverse(str, 0, len-1);
return str;
}
int main() {
string str = "abcdefg";
int k = 2;
string res = rightRotateString(str, k);
cout << "右旋 " << k << " 步后:" << res << endl;
return 0;
}
在上述代码中,我们定义了与左旋函数相同的翻转函数,并实现了字符串的右旋函数rightRotateString
。在函数中,我们先计算需要左旋的步数为string.size()-k
,然后调用左旋函数即可。具体来说,我们分别翻转前left个字符和剩余字符,然后再翻转整个字符串。最后,我们将结果返回。在主函数中,我们使用字符串abcdefg
,并右旋2步,输出结果为fgabcde
。
结论
本文介绍了C++语言中如何实现字符串的左旋和右旋操作。通过翻转字符串的部分和整个字符串,我们可以高效地实现这两种操作。对于字符串操作,我们还可以使用其他字符串函数和库来实现不同的功能,提高开发效率。