برنامه چاپ جایگشت های رشته — به زبان ساده
«جایگشت» (Permutation) در ریاضیات، کار سازماندهی اعضای یک مجموعه در توالی یا ترتیبها است. اگر مجموعه خود مرتب باشد، باز سازماندهی (مرتبسازی مجدد) عناصر آن با اهداف گوناگون انجام میشود که به این فرایند، جایگشت میگویند. جایگشت با «ترکیب» (Combinations) که انتخاب از میان اعضای مجموعه، صرف نظر از ترتیب آنها است، به طور کامل تفاوت دارد. یک رشته با طول n، دارای !n جایگشت است. در این مطلب، روش نوشتن برنامه چاپ جایگشت های رشته تشریح شده است. در ادامه، جایگشتهای گوناگون رشته ABC را میتوان مشاهده کرد.
ABC ACB BAC BCA CBA CAB
در تصویر زیر، راهکار مورد استفاده برای به دست آوردن جایگشتهای مختلف رشته ABC با استفاده از روش «پَسگرد» (Backtracking) قابل مشاهده است. در ادامه، پیادهسازی روش مذکور با استفاده از زبانهای برنامهنویسی گوناگون، شامل «سیپلاسپلاس» (++C ،(C، «جاوا» (Java)، «پایتون» (Python)، «سیشارپ» (#C) و «پیاچپی» (PHP) انجام شده است.
برنامه چاپ جایگشت های رشته در ++C
1// C++ program to print all
2// permutations with duplicates allowed
3#include <bits/stdc++.h>
4using namespace std;
5
6
7// Function to print permutations of string
8// This function takes three parameters:
9// 1. String
10// 2. Starting index of the string
11// 3. Ending index of the string.
12void permute(string a, int l, int r)
13{
14 // Base case
15 if (l == r)
16 cout<<a<<endl;
17 else
18 {
19 // Permutations made
20 for (int i = l; i <= r; i++)
21 {
22
23 // Swapping done
24 swap(a[l], a[i]);
25
26 // Recursion called
27 permute(a, l+1, r);
28
29 //backtrack
30 swap(a[l], a[i]);
31 }
32 }
33}
34
35// Driver Code
36int main()
37{
38 string str = "ABC";
39 int n = str.size();
40 permute(str, 0, n-1);
41 return 0;
42}
43
44// This is code is contributed by rathbhupendra
برنامه چاپ جایگشت های رشته در C
1// C program to print all permutations with duplicates allowed
2#include <stdio.h>
3#include <string.h>
4
5/* Function to swap values at two pointers */
6void swap(char *x, char *y)
7{
8 char temp;
9 temp = *x;
10 *x = *y;
11 *y = temp;
12}
13
14/* Function to print permutations of string
15 This function takes three parameters:
16 1. String
17 2. Starting index of the string
18 3. Ending index of the string. */
19void permute(char *a, int l, int r)
20{
21 int i;
22 if (l == r)
23 printf("%s\n", a);
24 else
25 {
26 for (i = l; i <= r; i++)
27 {
28 swap((a+l), (a+i));
29 permute(a, l+1, r);
30 swap((a+l), (a+i)); //backtrack
31 }
32 }
33}
34
35/* Driver program to test above functions */
36int main()
37{
38 char str[] = "ABC";
39 int n = strlen(str);
40 permute(str, 0, n-1);
41 return 0;
42}
برنامه چاپ جایگشت های رشته در جاوا
1// Java program to print all permutations of a
2// given string.
3public class Permutation
4{
5 public static void main(String[] args)
6 {
7 String str = "ABC";
8 int n = str.length();
9 Permutation permutation = new Permutation();
10 permutation.permute(str, 0, n-1);
11 }
12
13 /**
14 * permutation function
15 * @param str string to calculate permutation for
16 * @param l starting index
17 * @param r end index
18 */
19 private void permute(String str, int l, int r)
20 {
21 if (l == r)
22 System.out.println(str);
23 else
24 {
25 for (int i = l; i <= r; i++)
26 {
27 str = swap(str,l,i);
28 permute(str, l+1, r);
29 str = swap(str,l,i);
30 }
31 }
32 }
33
34 /**
35 * Swap Characters at position
36 * @param a string value
37 * @param i position 1
38 * @param j position 2
39 * @return swapped string
40 */
41 public String swap(String a, int i, int j)
42 {
43 char temp;
44 char[] charArray = a.toCharArray();
45 temp = charArray[i] ;
46 charArray[i] = charArray[j];
47 charArray[j] = temp;
48 return String.valueOf(charArray);
49 }
50
51}
52
53// This code is contributed by Mihir Joshi
برنامه چاپ جایگشت های رشته در پایتون
1# Python program to print all permutations with
2# duplicates allowed
3
4def toString(List):
5 return ''.join(List)
6
7# Function to print permutations of string
8# This function takes three parameters:
9# 1. String
10# 2. Starting index of the string
11# 3. Ending index of the string.
12def permute(a, l, r):
13 if l==r:
14 print (toString(a))
15 else:
16 for i in range(l,r):
17 a[l], a[i] = a[i], a[l]
18 permute(a, l+1, r)
19 a[l], a[i] = a[i], a[l] # backtrack
20
21# Driver program to test the above function
22string = "ABC"
23n = len(string)
24a = list(string)
25permute(a, 0, n)
26
27# This code is contributed by Bhavya Jain
برنامه چاپ جایگشت های رشته در #C
1// C# program to print all
2// permutations of a given string.
3using System;
4
5class GFG
6{
7 /**
8 * permutation function
9 * @param str string to
10 calculate permutation for
11 * @param l starting index
12 * @param r end index
13 */
14 private static void permute(String str,
15 int l, int r)
16 {
17 if (l == r)
18 Console.WriteLine(str);
19 else
20 {
21 for (int i = l; i <= r; i++)
22 {
23 str = swap(str, l, i);
24 permute(str, l + 1, r);
25 str = swap(str, l, i);
26 }
27 }
28 }
29
30 /**
31 * Swap Characters at position
32 * @param a string value
33 * @param i position 1
34 * @param j position 2
35 * @return swapped string
36 */
37 public static String swap(String a,
38 int i, int j)
39 {
40 char temp;
41 char[] charArray = a.ToCharArray();
42 temp = charArray[i] ;
43 charArray[i] = charArray[j];
44 charArray[j] = temp;
45 string s = new string(charArray);
46 return s;
47 }
48
49// Driver Code
50public static void Main()
51{
52 String str = "ABC";
53 int n = str.Length;
54 permute(str, 0, n-1);
55}
56}
57
58// This code is contributed by mits
برنامه چاپ جایگشت های رشته در PHP
1<?php
2// PHP program to print all
3// permutations of a given string.
4
5
6/**
7* permutation function
8* @param str string to
9* calculate permutation for
10* @param l starting index
11* @param r end index
12*/
13function permute($str, $l, $r)
14{
15 if ($l == $r)
16 echo $str. "\n";
17 else
18 {
19 for ($i = $l; $i <= $r; $i++)
20 {
21 $str = swap($str, $l, $i);
22 permute($str, $l + 1, $r);
23 $str = swap($str, $l, $i);
24 }
25 }
26}
27
28/**
29* Swap Characters at position
30* @param a string value
31* @param i position 1
32* @param j position 2
33* @return swapped string
34*/
35function swap($a, $i, $j)
36{
37 $temp;
38 $charArray = str_split($a);
39 $temp = $charArray[$i] ;
40 $charArray[$i] = $charArray[$j];
41 $charArray[$j] = $temp;
42 return implode($charArray);
43}
44
45// Driver Code
46$str = "ABC";
47$n = strlen($str);
48permute($str, 0, $n - 1);
49
50// This code is contributed by mits.
51?>
خروجی
خروجی قطعه کدهای بالا، برای رشته ABC، در ادامه ارائه شده است.
ABC ACB BAC BCA CBA CAB
پیچیدگی زمانی الگوریتم پسگرد مورد استفاده برای حل این مساله، از درجه (!O(n*n است. توجه به این نکته لازم است که !n جایگشت وجود دارد و نیازمند زمان (O(n برای چاپ کردن جایگشت است.
راهکار بالا، در صورت وجود کاراکتر تکراری در رشته ورودی، جایگشتهای تکراری را در خروجی چاپ میکند. میتوان الگوریتم را به نوعی بهبود بخشید که تنها جایگشتهای متمایز را چاپ کند؛ حتی در صورتی که تکرار در رشته ورودی وجود داشته باشد.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش برنامهنویسی C++
- مجموعه آموزشهای ریاضیات
- کد جمع کردن چند جملهای ها — راهنمای کاربردی
- برنامه ضرب چند جملهایها — راهنمای کاربردی
^^
خروجی کد پایتون اشتباه هست
xrange تعریف نشده.
سلام، وقت شما بخیر؛
از گزارش این مورد بسیار سپاسگزاریم. کد پایتون بازنگری و مجدداً درج شده است.
از همراهی شما با مجله فرادرس بسیار خرسندیم.