Java程序打印给定字符串的所有排列
排列也称为“排列编号”或“顺序”,是将有序列表 S 的元素重新排列为与 S 本身一一对应的关系。一个长度为 n 的字符串有 n!排列。
来源:Mathword(http://mathworld.wolfram.com/Permutation.html)
下面是字符串ABC 的排列。
ABC ACB BAC BCA CBA CAB
这是一个用作回溯基础的解决方案。
Java
// Java program to print all
// permutations of a given string.
public class Permutation
{
public static void main(String[] args)
{
String str = "ABC";
int n = str.length();
Permutation permutation =
new Permutation();
permutation.permute(str, 0, n-1);
}
/* Permutation function @param str
string to calculate permutation
for @param l starting index
@param r end index */
private void permute(String str,
int l, int r)
{
if (l == r)
System.out.println(str);
else
{
for (int i = l; i <= r; i++)
{
str = swap(str,l,i);
permute(str, l+1, r);
str = swap(str,l,i);
}
}
}
/* Swap Characters at position
@param a string value @param
i position 1 @param j position 2
@return swapped string */
public String swap(String a,
int i, int j)
{
char temp;
char[] charArray = a.toCharArray();
temp = charArray[i] ;
charArray[i] = charArray[j];
charArray[j] = temp;
return String.valueOf(charArray);
}
}
// This code is contributed by Mihir Joshi
Java
import java.util.*;
// Java program to implement
// the above approach
class GFG{
static void permute(String s,
String answer)
{
if (s.length() == 0)
{
System.out.print(answer + " ");
return;
}
for(int i = 0 ;i < s.length(); i++)
{
char ch = s.charAt(i);
String left_substr = s.substring(0, i);
String right_substr = s.substring(i + 1);
String rest = left_substr + right_substr;
permute(rest, answer + ch);
}
}
// Driver code
public static void main(String args[])
{
Scanner scan = new Scanner(System.in);
String s;
String answer="";
System.out.print(
"Enter the string : ");
s = scan.next();
System.out.print(
"\nAll possible strings are : ");
permute(s, answer);
}
}
// This code is contributed by adityapande88
输出:
ABC
ACB
BAC
BCA
CBA
CAB
算法范式:回溯
时间复杂度: O(n*n!) 注意有 n!排列,它需要 O(n) 时间来打印排列。
辅助空间: O(r – l)
注意:如果输入字符串中有重复字符,上述解决方案会打印重复排列。请参阅以下链接以获取即使输入中有重复项也仅打印不同排列的解决方案。
打印具有重复项的给定字符串的所有不同排列。
使用 STL 对给定字符串进行排列
另一种方法:
Java
import java.util.*;
// Java program to implement
// the above approach
class GFG{
static void permute(String s,
String answer)
{
if (s.length() == 0)
{
System.out.print(answer + " ");
return;
}
for(int i = 0 ;i < s.length(); i++)
{
char ch = s.charAt(i);
String left_substr = s.substring(0, i);
String right_substr = s.substring(i + 1);
String rest = left_substr + right_substr;
permute(rest, answer + ch);
}
}
// Driver code
public static void main(String args[])
{
Scanner scan = new Scanner(System.in);
String s;
String answer="";
System.out.print(
"Enter the string : ");
s = scan.next();
System.out.print(
"\nAll possible strings are : ");
permute(s, answer);
}
}
// This code is contributed by adityapande88
输出:
Enter the string : abc
All possible strings are : abc acb bac bca cab cba
时间复杂度: O(n*n!) 时间复杂度与上述方法相同,即有 n!排列,它需要 O(n) 时间来打印排列。
辅助空间: O(|s|)