生成给定字符串的所有旋转
给定一个字符串S。任务是打印给定字符串的所有可能旋转的字符串。
例子:
Input : S = "geeks"
Output : geeks
eeksg
eksge
ksgee
sgeek
Input : S = "abc"
Output : abc
bca
cab
方法1(简单)
这个想法是从 i = 0 到 n – 1 (n =字符串长度)运行一个循环,即对于每个旋转点,将字符串的第二部分复制到临时字符串中,然后复制原始字符串的第一部分到临时字符串。
下面实现这种方法:
C++
// A simple C++ program to generate all rotations
// of a given string
#include
using namespace std;
// Print all the rotated string.
void printRotatedString(char str[])
{
int len = strlen(str);
// Generate all rotations one by one and print
char temp[len];
for (int i = 0; i < len; i++)
{
int j = i; // Current index in str
int k = 0; // Current index in temp
// Copying the second part from the point
// of rotation.
while (str[j] != '\0')
{
temp[k] = str[j];
k++;
j++;
}
// Copying the first part from the point
// of rotation.
j = 0;
while (j < i)
{
temp[k] = str[j];
j++;
k++;
}
printf("%s\n", temp);
}
}
// Driven Program
int main()
{
char str[] = "geeks";
printRotatedString(str);
return 0;
}
Java
// A simple Java program to generate all rotations
// of a given string
class Test
{
// Print all the rotated string.
static void printRotatedString(String str)
{
int len = str.length();
// Generate all rotations one by one and print
StringBuffer sb;
for (int i = 0; i < len; i++)
{
sb = new StringBuffer();
int j = i; // Current index in str
int k = 0; // Current index in temp
// Copying the second part from the point
// of rotation.
for (int k2 = j; k2 < str.length(); k2++) {
sb.insert(k, str.charAt(j));
k++;
j++;
}
// Copying the first part from the point
// of rotation.
j = 0;
while (j < i)
{
sb.insert(k, str.charAt(j));
j++;
k++;
}
System.out.println(sb);
}
}
// Driver method
public static void main(String[] args)
{
String str = new String("geeks");
printRotatedString(str);
}
}
Python3
# A simple Python3 program to generate
# all rotations of a given string
# Print all the rotated strings.
def printRotatedString(str):
lenn = len(str)
# Generate all rotations
# one by one and print
temp = [0] * (lenn)
for i in range(lenn):
j = i # Current index in str
k = 0 # Current index in temp
# Copying the second part from
# the point of rotation.
while (j < len(str)):
temp[k] = str[j]
k += 1
j += 1
# Copying the first part from
# the point of rotation.
j = 0
while (j < i) :
temp[k] = str[j]
j += 1
k += 1
print(*temp, sep = "")
# Driver Code
if __name__ == '__main__':
str = "geeks"
printRotatedString(str)
# This code is contributed
# by SHUBHAMSINGH10
C#
// A simple C# program to generate
// all rotations of a given string
using System;
using System.Text;
class GFG
{
// Print all the rotated string.
public static void printRotatedString(string str)
{
int len = str.Length;
// Generate all rotations one
// by one and print
StringBuilder sb;
for (int i = 0; i < len; i++)
{
sb = new StringBuilder();
int j = i; // Current index in str
int k = 0; // Current index in temp
// Copying the second part from
// the point of rotation.
for (int k2 = j; k2 < str.Length; k2++)
{
sb.Insert(k, str[j]);
k++;
j++;
}
// Copying the first part from
// the point of rotation.
j = 0;
while (j < i)
{
sb.Insert(k, str[j]);
j++;
k++;
}
Console.WriteLine(sb);
}
}
// Driver Code
public static void Main(string[] args)
{
string str = "geeks";
printRotatedString(str);
}
}
// This code is contributed
// by Shrikant13
PHP
Javascript
C++
// An efficient C++ program to print all
// rotations of a string.
#include
using namespace std;
// Print all the rotated string.
void printRotatedString(char str[])
{
int n = strlen(str);
// Concatenate str with itself
char temp[2*n + 1];
strcpy(temp, str);
strcat(temp, str);
// Print all substrings of size n.
// Note that size of temp is 2n
for (int i = 0; i < n; i++)
{
for (int j=0; j != n; j++)
printf("%c",temp[i + j]);
printf("\n");
}
}
// Driven Program
int main()
{
char str[] = "geeks";
printRotatedString(str);
return 0;
}
Java
// A simple Java program to generate all rotations
// of a given string
class Test
{
// Print all the rotated string.
static void printRotatedString(String str)
{
int n = str.length();
StringBuffer sb = new StringBuffer(str);
// Concatenate str with itself
sb.append(str);
// Print all substrings of size n.
// Note that size of sb is 2n
for (int i = 0; i < n; i++)
{
for (int j=0; j != n; j++)
System.out.print(sb.charAt(i + j));
System.out.println();
}
}
// Driver method
public static void main(String[] args)
{
String str = new String("geeks");
printRotatedString(str);
}
}
Python3
# An efficient Python3 program to print
# all rotations of a string.
# Print all the rotated string.
def printRotatedString(string) :
n = len(string)
# Concatenate str with itself
temp = string + string
# Print all substrings of size n.
# Note that size of temp is 2n
for i in range(n) :
for j in range(n) :
print(temp[i + j], end = "")
print()
# Driver Code
if __name__ == "__main__" :
string = "geeks"
printRotatedString(string)
# This code is contributed by Ryuga
C#
// A simple C# program to generate all rotations
// of a given string
using System;
using System.Text;
class Test
{
// Print all the rotated string.
static void printRotatedString(String str)
{
int n = str.Length;
StringBuilder sb = new StringBuilder(str);
// Concatenate str with itself
sb.Append(str);
// Print all substrings of size n.
// Note that size of sb is 2n
for (int i = 0; i < n; i++)
{
for (int j=0; j != n; j++)
Console.Write(sb[i + j]);
Console.WriteLine();
}
}
// Driver method
public static void Main(String[] args)
{
String str = "geeks";
printRotatedString(str);
}
}
PHP
Javascript
输出:
geeks
eeksg
eksge
ksgee
sgeek
方法2(棘手且高效)
这个想法是基于检查字符串是否相互旋转的有效方法。我们将 str 与自身连接起来,即我们在 str.str where 中做。是连接运算符。现在我们从 0 到 n – 1 遍历连接的字符串并打印所有大小为 n 的子字符串。
下面是这种方法的实现:
C++
// An efficient C++ program to print all
// rotations of a string.
#include
using namespace std;
// Print all the rotated string.
void printRotatedString(char str[])
{
int n = strlen(str);
// Concatenate str with itself
char temp[2*n + 1];
strcpy(temp, str);
strcat(temp, str);
// Print all substrings of size n.
// Note that size of temp is 2n
for (int i = 0; i < n; i++)
{
for (int j=0; j != n; j++)
printf("%c",temp[i + j]);
printf("\n");
}
}
// Driven Program
int main()
{
char str[] = "geeks";
printRotatedString(str);
return 0;
}
Java
// A simple Java program to generate all rotations
// of a given string
class Test
{
// Print all the rotated string.
static void printRotatedString(String str)
{
int n = str.length();
StringBuffer sb = new StringBuffer(str);
// Concatenate str with itself
sb.append(str);
// Print all substrings of size n.
// Note that size of sb is 2n
for (int i = 0; i < n; i++)
{
for (int j=0; j != n; j++)
System.out.print(sb.charAt(i + j));
System.out.println();
}
}
// Driver method
public static void main(String[] args)
{
String str = new String("geeks");
printRotatedString(str);
}
}
Python3
# An efficient Python3 program to print
# all rotations of a string.
# Print all the rotated string.
def printRotatedString(string) :
n = len(string)
# Concatenate str with itself
temp = string + string
# Print all substrings of size n.
# Note that size of temp is 2n
for i in range(n) :
for j in range(n) :
print(temp[i + j], end = "")
print()
# Driver Code
if __name__ == "__main__" :
string = "geeks"
printRotatedString(string)
# This code is contributed by Ryuga
C#
// A simple C# program to generate all rotations
// of a given string
using System;
using System.Text;
class Test
{
// Print all the rotated string.
static void printRotatedString(String str)
{
int n = str.Length;
StringBuilder sb = new StringBuilder(str);
// Concatenate str with itself
sb.Append(str);
// Print all substrings of size n.
// Note that size of sb is 2n
for (int i = 0; i < n; i++)
{
for (int j=0; j != n; j++)
Console.Write(sb[i + j]);
Console.WriteLine();
}
}
// Driver method
public static void Main(String[] args)
{
String str = "geeks";
printRotatedString(str);
}
}
PHP
Javascript
输出:
geeks
eeksg
eksge
ksgee
sgeek