C++程序 左旋和右旋字符串

C++程序 左旋和右旋字符串

给定一个大小为n的字符串,编写函数执行以下操作:

  1. 把给定的字符串左旋d个元素(其中d≤n)
  2. 把给定的字符串右旋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)

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

C++ 示例