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)的时间内就地执行这两个旋转吗?
这个想法是基于一种基于反转算法的旋转方法。
下面是上述步骤的实现:
输出:
时间复杂度: O(N),因为我们使用循环遍历N次,所以它将耗费我们O(N)的时间。
辅助空间: O(1),因为我们不使用任何额外的空间。
方法2:
我们可以使用扩展字符串,它的大小是普通字符串的两倍来旋转字符串。对于左旋,从索引n到索引len(string)+n的扩展字符串访问。对于右旋,左移大小为d的字符串。
方法:
方法是
以下是以上方法的实现
输出:
时间复杂度: O(N),其中N是给定字符串的大小。
辅助空间: O(N)