给定一个单词,在字典上找到它的较小排列。例如,在字典上,较小的排列“ 4321”是“ 4312”,下一个较小的排列“ 4312”是“ 4231”。如果字符串按升序排序,则不存在下一个按字典顺序较小的排列。
我们已经讨论了next_permutation(),该字符串修改字符串,以便它存储按字典顺序较小的置换。 STL还提供std :: prev_permutation。如果函数可以将对象重新排列为字典上较小的排列,则返回“ true”。否则,它返回“ false”。
CPP
// C++ program to demonstrate working of
// prev_permutation()
#include
using namespace std;
// Driver code
int main()
{
string str = "4321";
if (prev_permutation(str.begin(), str.end()))
cout << "Previous permutation is " << str;
else
cout << "Previous permutation doesn't exist";
return 0;
}
C++
// C++ program to print all permutations with
// duplicates allowed using prev_permutation()
#include
using namespace std;
// Function to compute the previous permutation
bool prevPermutation(string& str)
{
// Find index of the last element of the string
int n = str.length() - 1;
// Find largest index i such that str[i - 1] >
// str[i]
int i = n;
while (i > 0 && str[i - 1] <= str[i])
i--;
// if string is sorted in ascending order
// we're at the last permutation
if (i <= 0)
return false;
// Note - str[i..n] is sorted in ascending order
// Find rightmost element's index that is less
// than str[i - 1]
int j = i - 1;
while (j + 1 <= n && str[j + 1] < str[i - 1])
j++;
// Swap character at i-1 with j
swap(str[i - 1], str[j]);
// Reverse the substring [i..n]
reverse(str.begin() + i, str.end());
return true;
}
// Driver code
int main()
{
string str = "4321";
if (prevPermutation(str))
cout << "Previous permutation is " << str;
else
cout << "Previous permutation doesn't exist";
return 0;
}
Java
// Java program to print all
// permutations with duplicates
// allowed using prev_permutation()
class GFG {
// Function to compute
// the previous permutation
static boolean prevPermutation(char[] str)
{
// Find index of the last
// element of the string
int n = str.length - 1;
// Find largest index i such
// that str[i - 1] > str[i]
int i = n;
while (i > 0 && str[i - 1] <= str[i]) {
i--;
}
// if string is sorted in
// ascending order we're
// at the last permutation
if (i <= 0) {
return false;
}
// Note - str[i..n] is sorted
// in ascending order Find
// rightmost element's index
// that is less than str[i - 1]
int j = i - 1;
while (j + 1 <= n && str[j + 1] <= str[i - 1]) {
j++;
}
// Swap character at i-1 with j
swap(str, i - 1, j);
// Reverse the substring [i..n]
StringBuilder sb
= new StringBuilder(String.valueOf(str));
sb.reverse();
str = sb.toString().toCharArray();
return true;
}
static String swap(char[] ch, int i, int j)
{
char temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
return String.valueOf(ch);
}
// Driver code
public static void main(String[] args)
{
char[] str = "4321".toCharArray();
if (prevPermutation(str)) {
System.out.println("Previous permutation is "
+ String.valueOf(str));
}
else {
System.out.println("Previous permutation"
+ "doesn't exist");
}
}
}
// This code is contributed by 29AjayKumar
Python
# Python 3 program to
# print all permutations with
# duplicates allowed
# using prev_permutation()
# Function to compute the
# previous permutation
def prevPermutation(str):
# Find index of the last element
# of the string
n = len(str) - 1
# Find largest index i such that
# str[i - 1] > str[i]
i = n
while (i > 0 and str[i - 1] <= str[i]):
i -= 1
# if string is sorted in ascending order
# we're at the last permutation
if (i <= 0):
return False
# Note - str[i..n] is sorted in
# ascending order
# Find rightmost element's index
# that is less than str[i - 1]
j = i - 1
while (j + 1 <= n and
str[j + 1] <= str[i - 1]):
j += 1
# Swap character at i-1 with j
str = list(str)
temp = str[i - 1]
str[i - 1] = str[j]
str[j] = temp
str = ''.join(str)
# Reverse the substring [i..n]
str[::-1]
return True, str
# Driver code
if __name__ == '__main__':
str = "4321"
b, str = prevPermutation(str)
if (b == True):
print("Previous permutation is", str)
else:
print("Previous permutation doesn't exist")
# This code is contributed by
# Sanjit_Prasad
C#
// C# program to print all
// permutations with duplicates
// allowed using prev_permutation()
using System;
class GFG {
// Function to compute
// the previous permutation
static Boolean prevPermutation(char[] str)
{
// Find index of the last
// element of the string
int n = str.Length - 1;
// Find largest index i such
// that str[i - 1] > str[i]
int i = n;
while (i > 0 && str[i - 1] <= str[i]) {
i--;
}
// if string is sorted in
// ascending order we're
// at the last permutation
if (i <= 0) {
return false;
}
// Note - str[i..n] is sorted
// in ascending order Find
// rightmost element's index
// that is less than str[i - 1]
int j = i - 1;
while (j + 1 <= n && str[j + 1] <= str[i - 1]) {
j++;
}
// Swap character at i-1 with j
swap(str, i - 1, j);
// Reverse the substring [i..n]
String sb = String.Join("", str);
sb = reverse(sb);
str = sb.ToString().ToCharArray();
return true;
}
static String swap(char[] ch, int i, int j)
{
char temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
return String.Join("", ch);
}
static String reverse(String input)
{
char[] temparray = input.ToCharArray();
int left, right = 0;
right = temparray.Length - 1;
for (left = 0; left < right; left++, right--) {
// Swap values of left and right
char temp = temparray[left];
temparray[left] = temparray[right];
temparray[right] = temp;
}
return String.Join("", temparray);
}
// Driver code
public static void Main(String[] args)
{
char[] str = "4321".ToCharArray();
if (prevPermutation(str)) {
Console.WriteLine("Previous permutation is "
+ String.Join("", str));
}
else {
Console.WriteLine("Previous permutation"
+ "doesn't exist");
}
}
}
// This code is contributed by Rajput-Ji
输出
Previous permutation is 4312
如何编写我们自己的prev_permutation()?
以下是查找先前排列的步骤:
- 找到最大索引i,使str [i – 1]> str [i]。
- 找到最大索引j,使j> = i并且str [j]
- 交换str [j]和str [i – 1]。
- 从str [i]开始颠倒子数组。
以下是上述步骤的执行情况–
C++
// C++ program to print all permutations with
// duplicates allowed using prev_permutation()
#include
using namespace std;
// Function to compute the previous permutation
bool prevPermutation(string& str)
{
// Find index of the last element of the string
int n = str.length() - 1;
// Find largest index i such that str[i - 1] >
// str[i]
int i = n;
while (i > 0 && str[i - 1] <= str[i])
i--;
// if string is sorted in ascending order
// we're at the last permutation
if (i <= 0)
return false;
// Note - str[i..n] is sorted in ascending order
// Find rightmost element's index that is less
// than str[i - 1]
int j = i - 1;
while (j + 1 <= n && str[j + 1] < str[i - 1])
j++;
// Swap character at i-1 with j
swap(str[i - 1], str[j]);
// Reverse the substring [i..n]
reverse(str.begin() + i, str.end());
return true;
}
// Driver code
int main()
{
string str = "4321";
if (prevPermutation(str))
cout << "Previous permutation is " << str;
else
cout << "Previous permutation doesn't exist";
return 0;
}
Java
// Java program to print all
// permutations with duplicates
// allowed using prev_permutation()
class GFG {
// Function to compute
// the previous permutation
static boolean prevPermutation(char[] str)
{
// Find index of the last
// element of the string
int n = str.length - 1;
// Find largest index i such
// that str[i - 1] > str[i]
int i = n;
while (i > 0 && str[i - 1] <= str[i]) {
i--;
}
// if string is sorted in
// ascending order we're
// at the last permutation
if (i <= 0) {
return false;
}
// Note - str[i..n] is sorted
// in ascending order Find
// rightmost element's index
// that is less than str[i - 1]
int j = i - 1;
while (j + 1 <= n && str[j + 1] <= str[i - 1]) {
j++;
}
// Swap character at i-1 with j
swap(str, i - 1, j);
// Reverse the substring [i..n]
StringBuilder sb
= new StringBuilder(String.valueOf(str));
sb.reverse();
str = sb.toString().toCharArray();
return true;
}
static String swap(char[] ch, int i, int j)
{
char temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
return String.valueOf(ch);
}
// Driver code
public static void main(String[] args)
{
char[] str = "4321".toCharArray();
if (prevPermutation(str)) {
System.out.println("Previous permutation is "
+ String.valueOf(str));
}
else {
System.out.println("Previous permutation"
+ "doesn't exist");
}
}
}
// This code is contributed by 29AjayKumar
Python
# Python 3 program to
# print all permutations with
# duplicates allowed
# using prev_permutation()
# Function to compute the
# previous permutation
def prevPermutation(str):
# Find index of the last element
# of the string
n = len(str) - 1
# Find largest index i such that
# str[i - 1] > str[i]
i = n
while (i > 0 and str[i - 1] <= str[i]):
i -= 1
# if string is sorted in ascending order
# we're at the last permutation
if (i <= 0):
return False
# Note - str[i..n] is sorted in
# ascending order
# Find rightmost element's index
# that is less than str[i - 1]
j = i - 1
while (j + 1 <= n and
str[j + 1] <= str[i - 1]):
j += 1
# Swap character at i-1 with j
str = list(str)
temp = str[i - 1]
str[i - 1] = str[j]
str[j] = temp
str = ''.join(str)
# Reverse the substring [i..n]
str[::-1]
return True, str
# Driver code
if __name__ == '__main__':
str = "4321"
b, str = prevPermutation(str)
if (b == True):
print("Previous permutation is", str)
else:
print("Previous permutation doesn't exist")
# This code is contributed by
# Sanjit_Prasad
C#
// C# program to print all
// permutations with duplicates
// allowed using prev_permutation()
using System;
class GFG {
// Function to compute
// the previous permutation
static Boolean prevPermutation(char[] str)
{
// Find index of the last
// element of the string
int n = str.Length - 1;
// Find largest index i such
// that str[i - 1] > str[i]
int i = n;
while (i > 0 && str[i - 1] <= str[i]) {
i--;
}
// if string is sorted in
// ascending order we're
// at the last permutation
if (i <= 0) {
return false;
}
// Note - str[i..n] is sorted
// in ascending order Find
// rightmost element's index
// that is less than str[i - 1]
int j = i - 1;
while (j + 1 <= n && str[j + 1] <= str[i - 1]) {
j++;
}
// Swap character at i-1 with j
swap(str, i - 1, j);
// Reverse the substring [i..n]
String sb = String.Join("", str);
sb = reverse(sb);
str = sb.ToString().ToCharArray();
return true;
}
static String swap(char[] ch, int i, int j)
{
char temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
return String.Join("", ch);
}
static String reverse(String input)
{
char[] temparray = input.ToCharArray();
int left, right = 0;
right = temparray.Length - 1;
for (left = 0; left < right; left++, right--) {
// Swap values of left and right
char temp = temparray[left];
temparray[left] = temparray[right];
temparray[right] = temp;
}
return String.Join("", temparray);
}
// Driver code
public static void Main(String[] args)
{
char[] str = "4321".ToCharArray();
if (prevPermutation(str)) {
Console.WriteLine("Previous permutation is "
+ String.Join("", str));
}
else {
Console.WriteLine("Previous permutation"
+ "doesn't exist");
}
}
}
// This code is contributed by Rajput-Ji
输出
Previous permutation is 4312