字符串的左旋转和右旋转
给定一个大小为 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"
一个简单的解决方案是使用临时字符串进行旋转。对于左旋转,首先复制最后 nd 个字符,然后将前 d 个字符复制到临时字符串。对于右旋转,首先复制最后 d 个字符,然后复制 nd 个字符。
我们可以同时进行原地旋转和 O(n) 时间吗?
这个想法是基于旋转的反转算法。
// Left rotate string s by d (Assuming d <= n)
leftRotate(s, d)
reverse(s, 0, d-1); // Reverse substring s[0..d-1]
reverse(s, d, n-1); // Reverse substring s[d..n-1]
reverse(s, 0, n-1); // Reverse whole string.
// Right rotate string s by d (Assuming d <= n)
rightRotate(s, d)
// We can also call above reverse steps
// with d = n-d.
leftRotate(s, n-d)
以下是上述步骤的实现:
C++
// C program for Left Rotation and Right
// Rotation of a String
#include
using namespace std;
// In-place rotates s towards left by d
void leftrotate(string &s, int d)
{
reverse(s.begin(), s.begin()+d);
reverse(s.begin()+d, s.end());
reverse(s.begin(), s.end());
}
// In-place rotates s towards right by d
void rightrotate(string &s, int d)
{
leftrotate(s, s.length()-d);
}
// Driver code
int main()
{
string str1 = "GeeksforGeeks";
leftrotate(str1, 2);
cout << str1 << endl;
string str2 = "GeeksforGeeks";
rightrotate(str2, 2);
cout << str2 << endl;
return 0;
}
Java
// Java program for Left Rotation and Right
// Rotation of a String
import java.util.*;
import java.io.*;
class GFG
{
// function that rotates s towards left by d
static String leftrotate(String str, int d)
{
String ans = str.substring(d) + str.substring(0, d);
return ans;
}
// function that rotates s towards right by d
static String rightrotate(String str, int d)
{
return leftrotate(str, str.length() - d);
}
// Driver code
public static void main(String args[])
{
String str1 = "GeeksforGeeks";
System.out.println(leftrotate(str1, 2));
String str2 = "GeeksforGeeks";
System.out.println(rightrotate(str2, 2));
}
}
// This code is contributed by rachana soma
Python3
# Python3 program for Left
# Rotation and Right
# Rotation of a String
# In-place rotates s towards left by d
def leftrotate(s, d):
tmp = s[d : ] + s[0 : d]
return tmp
# In-place rotates s
# towards right by d
def rightrotate(s, d):
return leftrotate(s, len(s) - d)
# Driver code
if __name__=="__main__":
str1 = "GeeksforGeeks"
print(leftrotate(str1, 2))
str2 = "GeeksforGeeks"
print(rightrotate(str2, 2))
# This code is contributed by Rutvik_56
C#
// C# program for Left Rotation and Right
// Rotation of a String
using System;
class GFG
{
// function that rotates s towards left by d
static String leftrotate(String str, int d)
{
String ans = str.Substring(d,str.Length-d) + str.Substring(0, d);
return ans;
}
// function that rotates s towards right by d
static String rightrotate(String str, int d)
{
return leftrotate(str, str.Length - d);
}
// Driver code
public static void Main(String []args)
{
String str1 = "GeeksforGeeks";
Console.WriteLine(leftrotate(str1, 2));
String str2 = "GeeksforGeeks";
Console.WriteLine(rightrotate(str2, 2));
}
}
/* This code is contributed by PrinciRaj1992 */
Javascript
输出:
Left rotation: eksforGeeksGe
Right rotation: ksGeeksforGee
时间复杂度: O(N)
辅助空间: O(N)