C++程序 左旋和右旋字符串
给定一个大小为n的字符串,编写函数执行以下操作:
- 把给定的字符串左旋d个元素(其中d≤n)
- 把给定的字符串右旋d个元素(其中d≤n)。
例子:
Input : s = “GeeksforGeeks”
d = 2
Output : Left Rotation : “eksforGeeksGe”
Right Rotation : “ksGeeksforGee”
Input : s = “qwertyu”
d = 2
Output : Left rotation : “ertyuqw”
Right rotation : “yuqwert”
方法1:
A 简单的解决方案 是使用一个临时字符串进行旋转。对于左旋,首先将后n-d个字符复制,然后将前d个字符按顺序复制到临时字符串中。对于右旋,首先将最后d个字符复制,然后复制n-d个字符。
我们能在O(n)的时间内就地执行这两个旋转吗?
这个想法是基于一种基于反转算法的旋转方法。
// 左旋字符串s由d旋转(假设d≤n)
**leftRotate(s, d)**
reverse(s, 0, d-1); // 反转子字符串s[0..d-1]
reverse(s, d, n-1); // 反转子字符串s[d..n-1]
reverse(s, 0, n-1); // 反转整个字符串
//右旋字符串s由d旋转(假设d≤n)
**rightRotate(s, d)**
//我们也可以调用上述反转步骤
//使用d = n-d。
leftRotate(s, n-d)
下面是上述步骤的实现:
//C左旋和右旋字符串的程序
#include
using namespace std;
//就地向左旋转s d次
void leftrotate(string &s, int d)
{
reverse(s.begin(), s.begin()+d);
reverse(s.begin()+d, s.end());
reverse(s.begin(), s.end());
}
//就地向右旋转s d次
void rightrotate(string &s, int d)
{
leftrotate(s, s.length()-d);
}
// 驱动代
int main()
{
string str1 = "GeeksforGeeks";
leftrotate(str1, 2);
cout << str1 << endl;
string str2 = "GeeksforGeeks";
rightrotate(str2, 2);
cout << str2 << endl;
return 0;
}
输出:
Left rotation: eksforGeeksGe
Right rotation: ksGeeksforGee
时间复杂度: O(N),因为我们使用循环遍历N次,所以它将耗费我们O(N)的时间。
辅助空间: O(1),因为我们不使用任何额外的空间。
方法2:
我们可以使用扩展字符串,它的大小是普通字符串的两倍来旋转字符串。对于左旋,从索引n到索引len(string)+n的扩展字符串访问。对于右旋,左移大小为d的字符串。
方法:
方法是
// 左旋字符串s d个
leftRotate(s, n)
temp = s + s; //扩展字符串
l1 = s.length //字符串长度
return temp[n : l1+n] //返回旋转后的字符串。
// 右旋字符串s n个
rightRotate(s, n)
//我们也可以调用上述反转步骤
//用x = s.length - n。
leftRotate(s, x-n)
以下是以上方法的实现
// C++程序用于字符串的左旋和右旋
//包含bits/stdc++.h头文件
#include <bits/stdc++.h>
using namespace std;
//使用扩展字符串旋转
string leftrotate(string str1, int n)
{
//创建扩展字符串和新旋转字符串的索引
string temp = str1 + str1;
int l1 = str1.size();
string Lfirst = temp.substr(n, l1);
//返回字符串
return Lfirst;
}
//使用扩展字符串旋转
string rightrotate(string str1, int n)
{
return leftrotate(str1, str1.size() - n);
}
//主函数
int main()
{
string str1 = leftrotate("GeeksforGeeks", 2);
cout << str1 << endl;
string str2 = rightrotate("GeeksforGeeks", 2);
cout << str2 << endl;
return 0;
}
//该代码由Susobhan Akhuli贡献```
输出:
eksforGeeksGe
ksGeeksforGee
时间复杂度: O(N),其中N是给定字符串的大小。
辅助空间: O(N)