স্ট্রিং / পূর্ণসংখ্যার সমস্ত ক্রিয়াকলাপ তালিকাভুক্ত


159

প্রোগ্রামিং সাক্ষাত্কারে একটি সাধারণ কাজ (যদিও আমার সাক্ষাত্কারের অভিজ্ঞতা থেকে নয়) একটি স্ট্রিং বা একটি পূর্ণসংখ্যা গ্রহণ এবং প্রতিটি সম্ভাব্য ক্রমবর্ধনের তালিকাভুক্ত করা।

এটি কীভাবে করা যায় এবং এরকম সমস্যা সমাধানের পিছনে যুক্তি রয়েছে?

আমি কয়েকটি কোড স্নিপেট দেখেছি কিন্তু সেগুলি ভালভাবে মন্তব্য করা / ব্যাখ্যা করা হয়নি এবং এভাবে অনুসরণ করা শক্ত।


উত্তর:


152

প্রথমত: এটি অবশ্যই পুনরাবৃত্তির মতো গন্ধযুক্ত !

যেহেতু আপনিও নীতিটি জানতে চেয়েছিলেন, তাই আমি এটিকে মানব ভাষা ব্যাখ্যা করার জন্য যথাসাধ্য চেষ্টা করেছি। আমি মনে করি পুনরাবৃত্তি বেশিরভাগ সময় খুব সহজ। আপনাকে কেবল দুটি পদক্ষেপ উপলব্ধি করতে হবে:

  1. প্রথম পদক্ষেপ
  2. অন্যান্য সমস্ত পদক্ষেপ (সমস্ত একই যুক্তি সহ)

ইন মানুষের ভাষা :

সংক্ষেপে:
1. ১ মৌলের ক্রমান্বন একটি উপাদান।
২. উপাদানগুলির একটি সেটের ক্রমবিন্যাস হ'ল উপাদানগুলির একটি তালিকা, যা অন্যান্য উপাদানগুলির প্রতিটি ক্রমবর্ধনের সাথে একত্রিত হয়।

উদাহরণ:

যদি সেটটিতে কেবল একটি উপাদান থাকে ->
এটি ফিরিয়ে দিন।
পরম (ক) -> ক

যদি সেটে দুটি অক্ষর থাকে: এতে প্রতিটি উপাদানটির জন্য: উপাদানটি বাকি উপাদানগুলির ক্রমবর্ধন সহ, ফেরত দিন:

পরম (আব) ->

a + পরম (খ) -> আব

বি + পারম (ক) -> বা

আরও: সেটের প্রতিটি চরিত্রের জন্য: একটি সেট অক্ষরের সাথে ফিরে আসুন> সেটটির বাকী অংশের পারমুয়েশন দিয়ে সংযুক্ত

পরম (এবিসি) ->

a + পরম (বিসি) -> এবিসি , এসিবি

বি + পারম (এসি) -> ব্যাক , বিসিএ

সি + পারম (আব) -> ক্যাব , সিবিএ

পরম (abc ... z) ->

এ + পারম (...), বি + পারম (....)
....

আমি দেখেছি pseudocode হয় উপর http://www.programmersheaven.com/mb/Algorithms/369713/369713/permutation-algorithm-help/ :

makePermutations(permutation) {
  if (length permutation < required length) {
    for (i = min digit to max digit) {
      if (i not in permutation) {
        makePermutations(permutation+i)
      }
    }
  }
  else {
    add permutation to list
  }
}

সি শার্প

ঠিক আছে, এবং আরও কিছু বিস্তৃত (এবং যেহেতু এটি সি # ট্যাগ করা হয়েছে) থেকে, http://radio.weblogs.com/0111551/stories/2002/10/14/permutations.html : বরং দীর্ঘ, তবে আমি এটিকে অনুলিপি করার সিদ্ধান্ত নিয়েছি যাইহোক, পোস্টটি মূলটির উপর নির্ভর করে না।

ফাংশনটি অক্ষরের একটি স্ট্রিং নেয় এবং সেই যথাযথ স্ট্রিংয়ের প্রতিটি সম্ভাব্য ক্রমশক্তিটি লিখে রাখে, উদাহরণস্বরূপ, যদি "এবিসি" সরবরাহ করা থাকে তবে তা ছড়িয়ে দেওয়া উচিত:

এবিসি, এসিবি, বিএসি, বিসিএ, সিএবি, সিবিএ।

কোড:

class Program
{
    private static void Swap(ref char a, ref char b)
    {
        if (a == b) return;

        var temp = a;
        a = b;
        b = temp;
    }

    public static void GetPer(char[] list)
    {
        int x = list.Length - 1;
        GetPer(list, 0, x);
    }

    private static void GetPer(char[] list, int k, int m)
    {
        if (k == m)
        {
            Console.Write(list);
        }
        else
            for (int i = k; i <= m; i++)
            {
                   Swap(ref list[k], ref list[i]);
                   GetPer(list, k + 1, m);
                   Swap(ref list[k], ref list[i]);
            }
    }

    static void Main()
    {
        string str = "sagiv";
        char[] arr = str.ToCharArray();
        GetPer(arr);
    }
}

21
আরও কিছুটা স্পষ্টতার জন্য, আমি কে "recursionDepth" এবং এম "ম্যাক্সডেপথ" কল করব।
এনফারফ হার্ডার

3
২ য় অদলবদল ( Swap(ref list[k], ref list[i]);) অবিস্মরণীয়।
নাচ 2 ডি

1
এই সমাধানের জন্য আপনাকে ধন্যবাদ। আমি এটি থেকে এই ফিটল ( dotnetfiddle.net/oTzihw ) তৈরি করেছি (কে এবং এম এর পরিবর্তে যথাযথ নামকরণ সহ)। যতদূর আমি আলগোটি বুঝতে পারি, আপনি স্থানে মূল অ্যারেটি সম্পাদনা করার পরে দ্বিতীয় স্ব্যাপের প্রয়োজন (ব্যাকট্র্যাক করার জন্য)।
অ্যান্ড্রু

3
একটি ছোটখাটো বিষয়: দেখে মনে হচ্ছে অদলবদল বাফার ভেরিয়েবলের সাথে অ্যাকোয়ার্স ( ডটনেটার্পলসস / অদলবদ ) ব্যবহার না করে অদলবদল পদ্ধতিটি আরও ভালভাবে প্রয়োগ করা ভাল
সার্জিওয়েট

7
সি # 7 টি টিপলস ব্যবহার করে আপনি অদলবদলকে অনেক বেশি মার্জিত করতে পারেন:(a[x], a[y]) = (a[y], a[x]);
ড্যারেন

81

যদি লিনকিউ ব্যবহারের অনুমতি দেওয়া হয় তবে এটি কোডের দুটি মাত্র লাইন। আমার উত্তর এখানে দেখুন

সম্পাদনা

এখানে আমার জেনেরিক ফাংশন যা টি এর তালিকা থেকে সমস্ত ক্রম (সংমিশ্রণ নয়) ফিরিয়ে দিতে পারে:

static IEnumerable<IEnumerable<T>>
    GetPermutations<T>(IEnumerable<T> list, int length)
{
    if (length == 1) return list.Select(t => new T[] { t });

    return GetPermutations(list, length - 1)
        .SelectMany(t => list.Where(e => !t.Contains(e)),
            (t1, t2) => t1.Concat(new T[] { t2 }));
}

উদাহরণ:

IEnumerable<IEnumerable<int>> result =
    GetPermutations(Enumerable.Range(1, 3), 3);

আউটপুট - পূর্ণসংখ্যা-তালিকার একটি তালিকা:

{1,2,3} {1,3,2} {2,1,3} {2,3,1} {3,1,2} {3,2,1}

যেহেতু এই ফাংশনটি লিনকিউ ব্যবহার করে তাই এর জন্য নেট নেট 3.5 বা তার বেশি প্রয়োজন।


3
সংমিশ্রণ এবং আদেশ পৃথক জিনিস। এটি একই রকম, তবে আপনার উত্তরটিতে উপাদানগুলির সেটগুলির সমস্ত ক্রয়ের তুলনায় একটি পৃথক সমস্যার উত্তর দেওয়া হয়েছে বলে মনে হচ্ছে।
শন কোভাক

@ শভনকোভাক, এটি দেখানোর জন্য ধন্যবাদ! আমি আমার কোড সংমিশ্রণ থেকে ক্রমশক্তি পর্যন্ত আপডেট করেছি।
পেঙ্গিয়াং

1
@ পেঙ্গিয়াং আমি আপনার অন্য উত্তরের দিকে নজর দিয়েছি এবং আমি বলব যে এটি আমাকে বেশ কার্যকর করেছে কিন্তু আমার আরও একটি পরিস্থিতি রয়েছে যা আপনি জানেন না যে আপনি এটি সমাধানের সঠিক উপায়টি নির্দেশ করেছেন কিনা। আমি 'হালোয়েন' এর মতো শব্দের সমস্ত অনুমতি খুঁজে পেতে চেয়েছিলাম তবে আমি খুঁজে পেয়েছি যে আমি ফলাফলের সেটে 'এল এর এবং উভয়' ই উভয়ই অন্তর্ভুক্ত করতে চাই। আমার পুনরাবৃত্তিতে আমি আপনার পদ্ধতিটি প্রতিটি পুনরাবৃত্তির (দৈর্ঘ্য ++) দিয়ে বর্ধিত দৈর্ঘ্য দেওয়ার জন্য লুপ করব এবং আশা করব যে হাল্লুয়েন (9 টি) শব্দটির পুরো দৈর্ঘ্য দেওয়া হলে আমি 9 টি অক্ষর লম্বা ফলাফল পাব ... তবে এটি এমন নয়: আমি কেবল 7 পেয়েছি (1 এল এবং 1 ই বাদ দেওয়া হয়েছে)
মেগা মার্ক

আমি আরও উল্লেখ করতে চাই যে আমি এমন পরিস্থিতি চাই না যেখানে আমি 9 'এইচ'কে' এইচ 'হিসাবে দেখি কেবল একবার শব্দটিতে প্রদর্শিত হয়।
মেগামার্ক

4
@ মেগামার্ক এই ফাংশনটির জন্য উপাদানগুলি অনন্য হতে হবে। এটি চেষ্টা করুন:const string s = "HALLOWEEN"; var result = GetPermutations(Enumerable.Range(0, s.Length), s.Length).Select(t => t.Select(i => s[i]));
পেঙ্গিয়াং

36

এখানে আমি সমাধানটি খুঁজে পেয়েছি। এটি জাভাতে লেখা হয়েছিল, তবে আমি এটি সি # তে রূপান্তর করেছি। আমি আশা করি এটা তোমাকে সাহায্য করবে।

এখানে চিত্র বিবরণ লিখুন

সি # তে কোডটি এখানে:

static void Main(string[] args)
{
    string str = "ABC";
    char[] charArry = str.ToCharArray();
    Permute(charArry, 0, 2);
    Console.ReadKey();
}

static void Permute(char[] arry, int i, int n)
{
    int j;
    if (i==n)
        Console.WriteLine(arry);
    else
    {
        for(j = i; j <=n; j++)
        {
            Swap(ref arry[i],ref arry[j]);
            Permute(arry,i+1,n);
            Swap(ref arry[i], ref arry[j]); //backtrack
        }
    }
}

static void Swap(ref char a, ref char b)
{
    char tmp;
    tmp = a;
    a=b;
    b = tmp;
}

এটি অন্য ভাষা থেকে পোর্ট করা আছে? ইমেজটির জন্য অবশ্যই +1, কারণ এটি সত্যিই মান যোগ করে। তবে কোডটি নিজেই একটি নির্দিষ্ট উন্নতির সম্ভাবনা রয়েছে বলে মনে হয়। কিছু ছোটখাটো অংশের প্রয়োজন হয় না তবে সর্বাগ্রে গুরুত্বপূর্ণ যে, যখন আমরা কিছু প্রেরণ করি এবং ইন-প্যারামিটার সরবরাহ করার পরিবর্তে এবং ফেরত মান আনার পরিবর্তে এটিতে স্টাফ করি তখন আমি এই সি ++ অনুভব করছি। প্রকৃতপক্ষে, আমি আপনার চিত্রটি একটি # স্টাইলযুক্ত সি # কোড বাস্তবায়নের জন্য ব্যবহার করেছি (স্টাইল অবশ্যই আমার ব্যক্তিগত উপলব্ধি, অবশ্যই) এবং এটি আমাকে প্রচুর পরিমাণে সহায়তা করেছিল, তাই যখন আমি এটি পোস্ট করব তখন অবশ্যই তা আপনার কাছ থেকে চুরি করব (এবং creditণ) আপনি এটির জন্য)।
কনরাড ভিল্টারস্টন

21

পুনরাবৃত্তি প্রয়োজন হয় না, এই সমাধান সম্পর্কে এখানে ভাল তথ্য।

var values1 = new[] { 1, 2, 3, 4, 5 };

foreach (var permutation in values1.GetPermutations())
{
    Console.WriteLine(string.Join(", ", permutation));
}

var values2 = new[] { 'a', 'b', 'c', 'd', 'e' };

foreach (var permutation in values2.GetPermutations())
{
    Console.WriteLine(string.Join(", ", permutation));
}

Console.ReadLine();

আমি বছরের পর বছর ধরে এই অ্যালগরিদম ব্যবহার করে আসছি, প্রতিটি ক্রমান্বয়ে গণনা করার জন্য এটিতে (এন) সময় এবং স্থান জটিলতা রয়েছে ।

public static class SomeExtensions
{
    public static IEnumerable<IEnumerable<T>> GetPermutations<T>(this IEnumerable<T> enumerable)
    {
        var array = enumerable as T[] ?? enumerable.ToArray();

        var factorials = Enumerable.Range(0, array.Length + 1)
            .Select(Factorial)
            .ToArray();

        for (var i = 0L; i < factorials[array.Length]; i++)
        {
            var sequence = GenerateSequence(i, array.Length - 1, factorials);

            yield return GeneratePermutation(array, sequence);
        }
    }

    private static IEnumerable<T> GeneratePermutation<T>(T[] array, IReadOnlyList<int> sequence)
    {
        var clone = (T[]) array.Clone();

        for (int i = 0; i < clone.Length - 1; i++)
        {
            Swap(ref clone[i], ref clone[i + sequence[i]]);
        }

        return clone;
    }

    private static int[] GenerateSequence(long number, int size, IReadOnlyList<long> factorials)
    {
        var sequence = new int[size];

        for (var j = 0; j < sequence.Length; j++)
        {
            var facto = factorials[sequence.Length - j];

            sequence[j] = (int)(number / facto);
            number = (int)(number % facto);
        }

        return sequence;
    }

    static void Swap<T>(ref T a, ref T b)
    {
        T temp = a;
        a = b;
        b = temp;
    }

    private static long Factorial(int n)
    {
        long result = n;

        for (int i = 1; i < n; i++)
        {
            result = result * i;
        }

        return result;
    }
}

বাক্সের বাইরে কাজ করে!
revobtz

1
সম্ভবত আমি ও (এন) স্বরলিপি বুঝতে পারি না। এন আপনার অ্যালগরিদমকে কাজ করার জন্য "অভ্যন্তরীণ লুপগুলি" প্রয়োজনীয় কতগুলি নির্দেশ করে না? আমার কাছে মনে হয় আপনার যদি এন নম্বর থাকে তবে মনে হয় এটি হে (এন * এন!) (কারণ এন! বার এটি এন অদলবদল করতে হবে)। এছাড়াও, এটি টন অ্যারে অনুলিপি করতে হবে। এই কোডটি "ঝরঝরে", তবে আমি এটি ব্যবহার করব না।
এরিক ফ্রেজার

@ ইরিকফ্রেজার প্রতিটি ক্রিয়াকলাপে কেবল একটি অ্যারে অনুলিপি ব্যবহার করা হয়, এবং O(N-1)ক্রম এবং O(N)অদলবদলের জন্য যা হয় O(N)। এবং আমি এখনও এটি উত্পাদনে ব্যবহার করছি তবে কেবলমাত্র একটির অনুক্রমের উত্পাদন করতে একটি চুল্লি সহ: GetPermutation(i)যেখানে 0 <= i <= N!-1। আমি এর থেকে আরও ভাল পারফরম্যান্স সহ কিছু ব্যবহার করতে পেরে খুশি হব, তাই আরও ভাল কিছু জন্য একটি রেফারেন্স কল করতে নির্দ্বিধায় থাকুন, বিকল্পের সর্বাধিক বিকল্পগুলি O(N!)মেমরিতে ব্যবহার করে যাতে আপনি এটিও পরীক্ষা করে দেখতে পারেন।
নাজেরা

11
void permute (char *str, int ptr) {
  int i, len;
  len = strlen(str);
  if (ptr == len) {
    printf ("%s\n", str);
    return;
  }

  for (i = ptr ; i < len ; i++) {
    swap (&str[ptr], &str[i]);
    permute (str, ptr + 1);
    swap (&str[ptr], &str[i]);
  }
}

আপনি অক্ষরগুলি অদলবদল করতে আপনার অদলবদল ফাংশন লিখতে পারেন।
এটিকে পারমিট (স্ট্রিং, 0) হিসাবে ডাকা হয়;


5
এটি সি # এর মতো দেখতে সি এর মতো দেখাচ্ছে।
জন স্নাইডার

9

প্রথমত, সেটের স্ট্রিম বা পূর্ণসংখ্যা নয়, ক্রমের অনুমতি রয়েছে, সুতরাং আমি কেবলমাত্র আপনার মানে "স্ট্রিংয়ের অক্ষরের সেট" mean

মনে রাখবেন আকারের একটি সেট n এর n আছে! এন-বিনিময়ের।

নিম্নলিখিত সিউডোকোড (উইকিপিডিয়া থেকে), কে = 1 দিয়ে ... এন! সমস্ত অনুমতি দেবে:

function permutation(k, s) {
    for j = 2 to length(s) {
        swap s[(k mod j) + 1] with s[j]; // note that our array is indexed starting at 1
        k := k / j; // integer division cuts off the remainder
    }
    return s;
}

এখানে পাইথন কোডের সমতুল্য (0-ভিত্তিক অ্যারে সূচকগুলির জন্য):

def permutation(k, s):
    r = s[:]
    for j in range(2, len(s)+1):
        r[j-1], r[k%j] = r[k%j], r[j-1]
        k = k/j+1
    return r

5
এই কি ভাষা? প্রশ্নটি সি # চিহ্নিত আছে। আমি জানি না কি k := k / j;করে।
শন কোভাক

8

সি # তে সামান্য পরিবর্তিত সংস্করণ যা যে কোনও ধরণের অ্যারেতে প্রয়োজনীয় ক্রমশক্তি দেয়।

    // USAGE: create an array of any type, and call Permutations()
    var vals = new[] {"a", "bb", "ccc"};
    foreach (var v in Permutations(vals))
        Console.WriteLine(string.Join(",", v)); // Print values separated by comma


public static IEnumerable<T[]> Permutations<T>(T[] values, int fromInd = 0)
{
    if (fromInd + 1 == values.Length)
        yield return values;
    else
    {
        foreach (var v in Permutations(values, fromInd + 1))
            yield return v;

        for (var i = fromInd + 1; i < values.Length; i++)
        {
            SwapValues(values, fromInd, i);
            foreach (var v in Permutations(values, fromInd + 1))
                yield return v;
            SwapValues(values, fromInd, i);
        }
    }
}

private static void SwapValues<T>(T[] values, int pos1, int pos2)
{
    if (pos1 != pos2)
    {
        T tmp = values[pos1];
        values[pos1] = values[pos2];
        values[pos2] = tmp;
    }
}

এই প্রয়োগের সাথে একটি সামান্য সতর্কতা: আপনি কেবলমাত্র গণনার মান সঞ্চয় করার চেষ্টা না করলে এটি কেবল সঠিকভাবে কাজ করে। যদি আপনি এর মতো কিছু করার চেষ্টা করেন Permutations(vals).ToArray()তবে আপনি একই অ্যারের এন রেফারেন্স সহ শেষ করবেন। আপনি যদি ফলাফলগুলি সংরক্ষণ করতে সক্ষম হতে চান তবে আপনাকে ম্যানুয়ালি একটি অনুলিপি তৈরি করতে হবে। উদাহরণস্বরূপPermutations(values).Select(v => (T[])v.Clone())
ফারাপ

8
class Program
{
    public static void Main(string[] args)
    {
        Permutation("abc");
    }

    static void Permutation(string rest, string prefix = "")
    {
        if (string.IsNullOrEmpty(rest)) Console.WriteLine(prefix);

        // Each letter has a chance to be permutated
        for (int i = 0; i < rest.Length; i++)
        {                
            Permutation(rest.Remove(i, 1), prefix + rest[i]);
        }
    }
}

1
উন্মাদ সমাধান। ধন্যবাদ!
ক্রিশ্চিয়ান ই

7

আমি এফব্রায়ান্ট approach approach পদ্ধতির পছন্দটি সহজ liked দুর্ভাগ্যক্রমে, এটি অন্যান্য অনেক "সমাধান" এর মতো করে যা সব অনুমতি দেয় না উদাহরণস্বরূপ একটি পূর্ণসংখ্যাতে যদি একই সংখ্যায় একাধিকবার থাকে। উদাহরণ হিসাবে 656123 নিন। লাইন:

var tail = chars.Except(new List<char>(){c});

ব্যতীত ব্যবহারের ফলে সমস্ত ঘটনা মুছে ফেলা হবে, যেমন সি = 6, দুটি অঙ্ক মুছে ফেলা হবে এবং উদাহরণস্বরূপ আমরা 5123 রেখে দিয়েছি Since যেহেতু আমি যে সমাধানটির সমাধান করার চেষ্টা করেছি সেগুলির কোনওটিই সমাধান করার সিদ্ধান্ত নিয়েছে না, তাই FBryant87 এর দ্বারা নিজেই চেষ্টা করে সমাধান করার সিদ্ধান্ত নিয়েছি it বেস হিসাবে কোড এটিই আমি নিয়ে এসেছি:

private static List<string> FindPermutations(string set)
    {
        var output = new List<string>();
        if (set.Length == 1)
        {
            output.Add(set);
        }
        else
        {
            foreach (var c in set)
            {
                // Remove one occurrence of the char (not all)
                var tail = set.Remove(set.IndexOf(c), 1);
                foreach (var tailPerms in FindPermutations(tail))
                {
                    output.Add(c + tailPerms);
                }
            }
        }
        return output;
    }

আমি কেবলমাত্র প্রথম পাওয়া ঘটনাটি ব্যবহার করে সরিয়ে ফেললাম। সরান এবং .আইডেক্সঅফ। কমপক্ষে আমার ব্যবহারের উদ্দেশ্যে হিসাবে কাজ করা বলে মনে হচ্ছে। আমি নিশ্চিত যে এটি চালক করা যেতে পারে।

তবে একটি বিষয় লক্ষণীয়: ফলাফলের তালিকায় সদৃশগুলি থাকতে পারে, সুতরাং নিশ্চিত হয়ে নিন যে আপনি পদ্ধতিটি ফেরত পাঠিয়েছেন উদাহরণস্বরূপ হ্যাশসেটের পরিবর্তে বা পছন্দসই কোনও পদ্ধতি ব্যবহার করে রিটার্নের পরে সদৃশগুলি সরিয়ে ফেলুন।


নিখুঁত সৌন্দর্যের মতো কাজ করে, আমি প্রথম খুঁজে পেয়েছি ডুপ্লিকেট অক্ষর +1 পরিচালনা করে
জ্যাক কেসি

5

এখানে পরবর্তী অনুমানের সন্ধানের জন্য একটির সহ সমস্ত ক্রিয়াকলাপ সন্ধানের জন্য তিনটি অ্যালগরিদম কভার করার একটি ভাল নিবন্ধ এখানে।

http://www.cut-the-knot.org/do_you_know/AllPerm.shtml

সি ++ এবং পাইথনের অন্তর্নির্মিত পরবর্তী_পরিচয় এবং itertools.permutations ফাংশন রয়েছে।


5

এখানে নিখুঁতভাবে কার্যকরী F # বাস্তবায়ন রয়েছে:


let factorial i =
    let rec fact n x =
        match n with
        | 0 -> 1
        | 1 -> x
        | _ -> fact (n-1) (x*n)
    fact i 1

let swap (arr:'a array) i j = [| for k in 0..(arr.Length-1) -> if k = i then arr.[j] elif k = j then arr.[i] else arr.[k] |]

let rec permutation (k:int,j:int) (r:'a array) =
    if j = (r.Length + 1) then r
    else permutation (k/j+1, j+1) (swap r (j-1) (k%j))

let permutations (source:'a array) = seq { for k = 0 to (source |> Array.length |> factorial) - 1 do yield permutation (k,2) source }

সিএলআর অ্যারেগুলির পরিবর্তনীয় প্রকৃতির সদ্ব্যবহার করার জন্য অদলবদল পরিবর্তনের মাধ্যমে পারফরম্যান্সে ব্যাপক উন্নতি করা যেতে পারে তবে উত্স অ্যারে সম্পর্কিত এই প্রয়োগটি থ্রেড নিরাপদ এবং এটি কিছু প্রসঙ্গে প্রযোজ্য হতে পারে। এছাড়াও, ১ than টিরও বেশি উপাদানগুলির সাথে অ্যারেগুলির জন্য বৃহত্তর / স্বেচ্ছাসেবী নির্ভুলতার সাথে প্রকারের সাথে প্রতিস্থাপন করতে হবে কারণ একটি ইন্টুয়াল over৩ এর প্রবাহের ফলে ১ 17 টি ফলস্বরূপ results


5

পুনরাবৃত্তি ব্যবহার করে সি # তে একটি সহজ সমাধান এখানে দেওয়া হয়েছে,

void Main()
{
    string word = "abc";
    WordPermuatation("",word);
}

void WordPermuatation(string prefix, string word)
{
    int n = word.Length;
    if (n == 0) { Console.WriteLine(prefix); }
    else
    {
        for (int i = 0; i < n; i++)
        {
            WordPermuatation(prefix + word[i],word.Substring(0, i) + word.Substring(i + 1, n - (i+1)));
        }
    }
}

খুব সহজ এবং সংক্ষিপ্ত সমাধানের জন্য আপনাকে ধন্যবাদ! :)
ক্রিস্টাপস ভিলার্টস

4

ইনপুট হিসাবে স্ট্রিং এবং পূর্ণসংখ্যা উভয়ের জন্য পারমুটাউন ফাংশনটি এখানে বোঝা সহজ। এটি দিয়ে আপনি নিজের আউটপুট দৈর্ঘ্যও সেট করতে পারেন set (যা স্বাভাবিক ক্ষেত্রে এটি ইনপুট দৈর্ঘ্য সমান)

দড়ি

    static ICollection<string> result;

    public static ICollection<string> GetAllPermutations(string str, int outputLength)
    {
        result = new List<string>();
        MakePermutations(str.ToCharArray(), string.Empty, outputLength);
        return result;
    }

    private static void MakePermutations(
       char[] possibleArray,//all chars extracted from input
       string permutation,
       int outputLength//the length of output)
    {
         if (permutation.Length < outputLength)
         {
             for (int i = 0; i < possibleArray.Length; i++)
             {
                 var tempList = possibleArray.ToList<char>();
                 tempList.RemoveAt(i);
                 MakePermutations(tempList.ToArray(), 
                      string.Concat(permutation, possibleArray[i]), outputLength);
             }
         }
         else if (!result.Contains(permutation))
            result.Add(permutation);
    }

এবং পূর্ণসংখ্যার জন্য কেবল কলার পদ্ধতিটি পরিবর্তন করুন এবং মেকপার্মিউটেশনগুলি () অপরিবর্তিত রয়েছে:

    public static ICollection<int> GetAllPermutations(int input, int outputLength)
    {
        result = new List<string>();
        MakePermutations(input.ToString().ToCharArray(), string.Empty, outputLength);
        return result.Select(m => int.Parse(m)).ToList<int>();
    }

উদাহরণ 1: গেটএলপ্রেরুটেশনস ("এবিসি", 3); "এবিসি" "এসিবি" "ব্যাক" "বিসিএ" "ক্যাব" "সিবিএ"

উদাহরণ 2: গেটএলপ্রেরুটেশনস ("অ্যাবিসিডি", 2); "আব" "এসি" "বিজ্ঞাপন" "বা" "বিসি" "বিডি" "সিএ" "সিবি" "সিডি" "দা" "ডিবি" "ডিসি"

উদাহরণ 3: গেটএলপ্রেরুটেশনস (486,2); 48 46 84 86 64 68


আমি আপনার সমাধানটি পছন্দ করি কারণ এটি বুঝতে সহজ, এটির জন্য আপনাকে ধন্যবাদ! তবুও আমি সেইটির সাথে যেতে বেছে নিয়েছি: স্ট্যাকওভারফ্লো . com / প্রশ্নস / 60৫০55৫৫৫ / / । ToList, ToArray এবং সরানোর জন্য কারন হ'ল ও (এন) এর সময়ের জটিলতা রয়েছে। সুতরাং মূলত আপনাকে সংগ্রহের সমস্ত উপাদানগুলি অতিক্রম করতে হবে (দেখুন স্ট্যাকওভারফ্লো . com/a/15042066/1132522 )। আপনি যখন মূলত শেষ পর্যন্ত আবার সমস্ত উপাদানগুলিকে ইন-তে রূপান্তর করতে যান সে ক্ষেত্রে একই কাজ করুন। আমি সম্মত হই যে যদিও এটি "abc" বা 486 এর জন্য খুব বেশি প্রভাব ফেলবে না।
অ্যান্ড্রু

2

এখানে ফাংশনটি যা সমস্ত অনুমতি প্রিন্ট করবে। এই ফাংশনটি পিটার দ্বারা ব্যাখ্যাযুক্ত যুক্তি প্রয়োগ করে।

public class Permutation
{
    //http://www.java2s.com/Tutorial/Java/0100__Class-Definition/RecursivemethodtofindallpermutationsofaString.htm

    public static void permuteString(String beginningString, String endingString)
    {           

        if (endingString.Length <= 1)
            Console.WriteLine(beginningString + endingString);
        else
            for (int i = 0; i < endingString.Length; i++)
            {

                String newString = endingString.Substring(0, i) + endingString.Substring(i + 1);

                permuteString(beginningString + endingString.ElementAt(i), newString);

            }
    }
}

    static void Main(string[] args)
    {

        Permutation.permuteString(String.Empty, "abc");
        Console.ReadLine();

    }

2

নীচে আমার অনুমোদনের বাস্তবায়ন। পরিবর্তনশীল নামগুলিতে কিছু মনে করবেন না, কারণ আমি এটি মজাদার জন্য করছিলাম :)

class combinations
{
    static void Main()
    {

        string choice = "y";
        do
        {
            try
            {
                Console.WriteLine("Enter word :");
                string abc = Console.ReadLine().ToString();
                Console.WriteLine("Combinatins for word :");
                List<string> final = comb(abc);
                int count = 1;
                foreach (string s in final)
                {
                    Console.WriteLine("{0} --> {1}", count++, s);
                }
                Console.WriteLine("Do you wish to continue(y/n)?");
                choice = Console.ReadLine().ToString();
            }
            catch (Exception exc)
            {
                Console.WriteLine(exc);
            }
        } while (choice == "y" || choice == "Y");
    }

    static string swap(string test)
    {
        return swap(0, 1, test);
    }

    static List<string> comb(string test)
    {
        List<string> sec = new List<string>();
        List<string> first = new List<string>();
        if (test.Length == 1) first.Add(test);
        else if (test.Length == 2) { first.Add(test); first.Add(swap(test)); }
        else if (test.Length > 2)
        {
            sec = generateWords(test);
            foreach (string s in sec)
            {
                string init = s.Substring(0, 1);
                string restOfbody = s.Substring(1, s.Length - 1);

                List<string> third = comb(restOfbody);
                foreach (string s1 in third)
                {
                    if (!first.Contains(init + s1)) first.Add(init + s1);
                }


            }
        }

        return first;
    }

    static string ShiftBack(string abc)
    {
        char[] arr = abc.ToCharArray();
        char temp = arr[0];
        string wrd = string.Empty;
        for (int i = 1; i < arr.Length; i++)
        {
            wrd += arr[i];
        }

        wrd += temp;
        return wrd;
    }

    static List<string> generateWords(string test)
    {
        List<string> final = new List<string>();
        if (test.Length == 1)
            final.Add(test);
        else
        {
            final.Add(test);
            string holdString = test;
            while (final.Count < test.Length)
            {
                holdString = ShiftBack(holdString);
                final.Add(holdString);
            }
        }

        return final;
    }

    static string swap(int currentPosition, int targetPosition, string temp)
    {
        char[] arr = temp.ToCharArray();
        char t = arr[currentPosition];
        arr[currentPosition] = arr[targetPosition];
        arr[targetPosition] = t;
        string word = string.Empty;
        for (int i = 0; i < arr.Length; i++)
        {
            word += arr[i];

        }

        return word;

    }
}

2

এখানে আমি একটি উচ্চ স্তরের উদাহরণ লিখেছি যা পিটারের দ্বারা মানুষের ভাষার ব্যাখ্যা ব্যাখ্যা করে:

    public List<string> FindPermutations(string input)
    {
        if (input.Length == 1)
            return new List<string> { input };
        var perms = new List<string>();
        foreach (var c in input)
        {
            var others = input.Remove(input.IndexOf(c), 1);
            perms.AddRange(FindPermutations(others).Select(perm => c + perm));
        }
        return perms;
    }

এই সমাধানটি আসলে ত্রুটিযুক্ত যদি স্ট্রিং সেটে কোনও পুনরাবৃত্তি অক্ষর থাকে তবে এটি ব্যর্থ হবে। উদাহরণস্বরূপ, 'পরীক্ষা' শব্দের উপর, ব্যতীত কমান্ডটি প্রয়োজন হলে কেবল প্রথম এবং শেষের পরিবর্তে 't' এর দুটি উদাহরণ সরিয়ে ফেলবে।
মিদ্দাস

1
@ মিদ্দাস ভালভাবে চিহ্নিত, ভাগ্যক্রমে আলিঙ্গন এটিকে সমাধান করার একটি সমাধান নিয়ে এসেছে।
FBryant87

1

যদি পারফরম্যান্স এবং মেমরির সমস্যা হয় তবে আমি এটি খুব দক্ষ প্রয়োগের পরামর্শ দিচ্ছি। উইকিপিডিয়ায় হ্যাপের অ্যালগরিদম অনুসারে এটি দ্রুত হওয়া উচিত। আশা করি এটি আপনার প্রয়োজনের সাথে খাপ খায় :-)!

ঠিক এর সাথে 10 এর জন্য একটি লিনাক বাস্তবায়নের সাথে তুলনা করা! (কোড অন্তর্ভুক্ত):

  • এটি: 235 মিলিসিমে 36288000 আইটেম
  • লিনক: 50051 মিলিসেকসে 36288000 আইটেম 28

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Runtime.CompilerServices;
    using System.Text;
    
    namespace WpfPermutations
    {
        /// <summary>
        /// EO: 2016-04-14
        /// Generator of all permutations of an array of anything.
        /// Base on Heap's Algorithm. See: https://en.wikipedia.org/wiki/Heap%27s_algorithm#cite_note-3
        /// </summary>
        public static class Permutations
        {
            /// <summary>
            /// Heap's algorithm to find all pmermutations. Non recursive, more efficient.
            /// </summary>
            /// <param name="items">Items to permute in each possible ways</param>
            /// <param name="funcExecuteAndTellIfShouldStop"></param>
            /// <returns>Return true if cancelled</returns> 
            public static bool ForAllPermutation<T>(T[] items, Func<T[], bool> funcExecuteAndTellIfShouldStop)
            {
                int countOfItem = items.Length;
    
                if (countOfItem <= 1)
                {
                    return funcExecuteAndTellIfShouldStop(items);
                }
    
                var indexes = new int[countOfItem];
                for (int i = 0; i < countOfItem; i++)
                {
                    indexes[i] = 0;
                }
    
                if (funcExecuteAndTellIfShouldStop(items))
                {
                    return true;
                }
    
                for (int i = 1; i < countOfItem;)
                {
                    if (indexes[i] < i)
                    { // On the web there is an implementation with a multiplication which should be less efficient.
                        if ((i & 1) == 1) // if (i % 2 == 1)  ... more efficient ??? At least the same.
                        {
                            Swap(ref items[i], ref items[indexes[i]]);
                        }
                        else
                        {
                            Swap(ref items[i], ref items[0]);
                        }
    
                        if (funcExecuteAndTellIfShouldStop(items))
                        {
                            return true;
                        }
    
                        indexes[i]++;
                        i = 1;
                    }
                    else
                    {
                        indexes[i++] = 0;
                    }
                }
    
                return false;
            }
    
            /// <summary>
            /// This function is to show a linq way but is far less efficient
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="list"></param>
            /// <param name="length"></param>
            /// <returns></returns>
            static IEnumerable<IEnumerable<T>> GetPermutations<T>(IEnumerable<T> list, int length)
            {
                if (length == 1) return list.Select(t => new T[] { t });
    
                return GetPermutations(list, length - 1)
                    .SelectMany(t => list.Where(e => !t.Contains(e)),
                        (t1, t2) => t1.Concat(new T[] { t2 }));
            }
    
            /// <summary>
            /// Swap 2 elements of same type
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="a"></param>
            /// <param name="b"></param>
            [MethodImpl(MethodImplOptions.AggressiveInlining)]
            static void Swap<T>(ref T a, ref T b)
            {
                T temp = a;
                a = b;
                b = temp;
            }
    
            /// <summary>
            /// Func to show how to call. It does a little test for an array of 4 items.
            /// </summary>
            public static void Test()
            {
                ForAllPermutation("123".ToCharArray(), (vals) =>
                {
                    Debug.Print(String.Join("", vals));
                    return false;
                });
    
                int[] values = new int[] { 0, 1, 2, 4 };
    
                Debug.Print("Non Linq");
                ForAllPermutation(values, (vals) =>
                {
                    Debug.Print(String.Join("", vals));
                    return false;
                });
    
                Debug.Print("Linq");
                foreach(var v in GetPermutations(values, values.Length))
                {
                    Debug.Print(String.Join("", v));
                }
    
                // Performance
                int count = 0;
    
                values = new int[10];
                for(int n = 0; n < values.Length; n++)
                {
                    values[n] = n;
                }
    
                Stopwatch stopWatch = new Stopwatch();
                stopWatch.Reset();
                stopWatch.Start();
    
                ForAllPermutation(values, (vals) =>
                {
                    foreach(var v in vals)
                    {
                        count++;
                    }
                    return false;
                });
    
                stopWatch.Stop();
                Debug.Print($"Non Linq {count} items in {stopWatch.ElapsedMilliseconds} millisecs");
    
                count = 0;
                stopWatch.Reset();
                stopWatch.Start();
    
                foreach (var vals in GetPermutations(values, values.Length))
                {
                    foreach (var v in vals)
                    {
                        count++;
                    }
                }
    
                stopWatch.Stop();
                Debug.Print($"Linq {count} items in {stopWatch.ElapsedMilliseconds} millisecs");
    
            }
        }
    }

1

জাভাস্ক্রিপ্ট (নোডজেএস) এ আমার সমাধান এখানে। মূল ধারণাটি হ'ল আমরা একবারে একটি উপাদান নিই, স্ট্রিং থেকে "এটিকে সরিয়ে ফেলি", বাকী অক্ষরের ভিন্নতা এবং সামনে উপাদানটি sertোকাতে পারি।

function perms (string) {
  if (string.length == 0) {
    return [];
  }
  if (string.length == 1) {
    return [string];
  }
  var list = [];
  for(var i = 0; i < string.length; i++) {
    var invariant = string[i];
    var rest = string.substr(0, i) + string.substr(i + 1);
    var newPerms = perms(rest);
    for (var j = 0; j < newPerms.length; j++) {
      list.push(invariant + newPerms[j]);
    }
  }
  return list;
}

module.exports = perms;

এবং পরীক্ষাগুলি এখানে:

require('should');
var permutations = require('../src/perms');

describe('permutations', function () {
  it('should permute ""', function () {
    permutations('').should.eql([]);
  })

  it('should permute "1"', function () {
    permutations('1').should.eql(['1']);
  })

  it('should permute "12"', function () {
    permutations('12').should.eql(['12', '21']);
  })

  it('should permute "123"', function () {
    var expected = ['123', '132', '321', '213', '231', '312'];
    var actual = permutations('123');
    expected.forEach(function (e) {
      actual.should.containEql(e);
    })
  })

  it('should permute "1234"', function () {
    // Wolfram Alpha FTW!
    var expected = ['1234', '1243', '1324', '1342', '1423', '1432', '2134', '2143', '2314', '2341', '2413', '2431', '3124', '3142', '3214', '3241', '3412', '3421', '4123', '4132'];
    var actual = permutations('1234');
    expected.forEach(function (e) {
      actual.should.containEql(e);
    })
  })
})

1

আমি ভাবতে পারি এমন সহজ সমাধানটি এখানে:

let rec distribute e = function
  | [] -> [[e]]
  | x::xs' as xs -> (e::xs)::[for xs in distribute e xs' -> x::xs]

let permute xs = Seq.fold (fun ps x -> List.collect (distribute x) ps) [[]] xs

distributeফাংশন একটি নতুন উপাদান লাগে eএবং n-element তালিকা এবং একটি তালিকা ফেরৎ n+1তালিকা প্রতিটি যা করেছে eএকটি ভিন্ন স্থানে ঢোকানো হয়েছে। উদাহরণস্বরূপ, 10তালিকার সম্ভাব্য চারটি স্থানে প্রতিটি সন্নিবেশ করানো [1;2;3]:

> distribute 10 [1..3];;
val it : int list list =
  [[10; 1; 2; 3]; [1; 10; 2; 3]; [1; 2; 10; 3]; [1; 2; 3; 10]]

permuteফাংশন প্রতিটি উপাদান ঘুরে, একাধিক বিন্যাসন এতদূর সঞ্চিত উপর বিতরণ সব একাধিক বিন্যাসন মধ্যে চূড়ান্ত পরিণতি পায় উপর folds। উদাহরণস্বরূপ, তালিকার perm টি অনুমান [1;2;3]:

> permute [1;2;3];;
val it : int list list =
  [[3; 2; 1]; [2; 3; 1]; [2; 1; 3]; [3; 1; 2]; [1; 3; 2]; [1; 2; 3]]

পরিবর্তন foldএকটি থেকে scanঅর্ডার অন্তর্বর্তী accumulators রাখতে কিভাবে একাধিক বিন্যাসন একটি সময়ে একটি উপাদান তৈরি হয় উপর কিছু আলোকপাত:

> Seq.scan (fun ps x -> List.collect (distribute x) ps) [[]] [1..3];;
val it : seq<int list list> =
  seq
    [[[]]; [[1]]; [[2; 1]; [1; 2]];
     [[3; 2; 1]; [2; 3; 1]; [2; 1; 3]; [3; 1; 2]; [1; 3; 2]; [1; 2; 3]]]

1

একটি স্ট্রিং এর ক্রমানুসারে তালিকাবদ্ধ। অক্ষর পুনরাবৃত্তি যখন সদৃশ এড়ানো:

using System;
using System.Collections;

class Permutation{
  static IEnumerable Permutations(string word){
    if (word == null || word.Length <= 1) {
      yield return word;
      yield break;
    }

    char firstChar = word[0];
    foreach( string subPermute in Permutations (word.Substring (1)) ) {
      int indexOfFirstChar = subPermute.IndexOf (firstChar);
      if (indexOfFirstChar == -1) indexOfFirstChar = subPermute.Length;

      for( int index = 0; index <= indexOfFirstChar; index++ )
        yield return subPermute.Insert (index, new string (firstChar, 1));
    }
  }

  static void Main(){
    foreach( var permutation in Permutations ("aab") )
      Console.WriteLine (permutation);
  }
}

2
ইতিমধ্যে উপস্থিত অনেকগুলি সমাধানের সমাধান সহ, আপনি এখানে বর্ণনা করতে চাইতে পারেন যে আপনার সমাধানটি এখানে অন্যান্য সমস্ত সমাধান থেকে কী আলাদা হয়ে যায়।
এনভিগেট

অক্ষরগুলি পুনরাবৃত্তি করা হলে সদৃশতা এড়ানো (অন্য উত্তরের জন্য চিন্দিরালার দ্বারা)। Aab Aba Baa: "Aab" এর জন্য
Val,

1

@ পিটারের সমাধানে বিল্ডিংয়ের জন্য, এখানে এমন একটি সংস্করণ রয়েছে যা একটি সাধারণ লিনকিউ-স্টাইলের Permutations()এক্সটেনশন পদ্ধতি ঘোষণা করে যা যে কোনওটিতে কাজ করে IEnumerable<T>

ব্যবহার (স্ট্রিং অক্ষরের উদাহরণে):

foreach (var permutation in "abc".Permutations())
{
    Console.WriteLine(string.Join(", ", permutation));
}

আউটপুট:

a, b, c
a, c, b
b, a, c
b, c, a
c, b, a
c, a, b

বা অন্য কোনও সংগ্রহের ধরণে:

foreach (var permutation in (new[] { "Apples", "Oranges", "Pears"}).Permutations())
{
    Console.WriteLine(string.Join(", ", permutation));
}

আউটপুট:

Apples, Oranges, Pears
Apples, Pears, Oranges
Oranges, Apples, Pears
Oranges, Pears, Apples
Pears, Oranges, Apples
Pears, Apples, Oranges
using System;
using System.Collections.Generic;
using System.Linq;

public static class PermutationExtension
{
    public static IEnumerable<T[]> Permutations<T>(this IEnumerable<T> source)
    {
        var sourceArray = source.ToArray();
        var results = new List<T[]>();
        Permute(sourceArray, 0, sourceArray.Length - 1, results);
        return results;
    }

    private static void Swap<T>(ref T a, ref T b)
    {
        T tmp = a;
        a = b;
        b = tmp;
    }

    private static void Permute<T>(T[] elements, int recursionDepth, int maxDepth, ICollection<T[]> results)
    {
        if (recursionDepth == maxDepth)
        {
            results.Add(elements.ToArray());
            return;
        }

        for (var i = recursionDepth; i <= maxDepth; i++)
        {
            Swap(ref elements[recursionDepth], ref elements[i]);
            Permute(elements, recursionDepth + 1, maxDepth, results);
            Swap(ref elements[recursionDepth], ref elements[i]);
        }
    }
}

0

এখানে ফাংশনটি যা সমস্ত ক্রম পুনরাবৃত্তভাবে মুদ্রণ করবে।

public void Permutations(string input, StringBuilder sb)
    {
        if (sb.Length == input.Length)
        {
            Console.WriteLine(sb.ToString());
            return;
        }

        char[] inChar = input.ToCharArray();

        for (int i = 0; i < input.Length; i++)
        {
            if (!sb.ToString().Contains(inChar[i]))
            {
                sb.Append(inChar[i]);
                Permutations(input, sb);    
                RemoveChar(sb, inChar[i]);
            }
        }
    }

private bool RemoveChar(StringBuilder input, char toRemove)
    {
        int index = input.ToString().IndexOf(toRemove);
        if (index >= 0)
        {
            input.Remove(index, 1);
            return true;
        }
        return false;
    }

0
class Permutation
{
    public static List<string> Permutate(string seed, List<string> lstsList)
    {
        loopCounter = 0;
        // string s="\w{0,2}";
        var lstStrs = PermuateRecursive(seed);

        Trace.WriteLine("Loop counter :" + loopCounter);
        return lstStrs;
    }

    // Recursive function to find permutation
    private static List<string> PermuateRecursive(string seed)
    {
        List<string> lstStrs = new List<string>();

        if (seed.Length > 2)
        {
            for (int i = 0; i < seed.Length; i++)
            {
                str = Swap(seed, 0, i);

                PermuateRecursive(str.Substring(1, str.Length - 1)).ForEach(
                    s =>
                    {
                        lstStrs.Add(str[0] + s);
                        loopCounter++;
                    });
                ;
            }
        }
        else
        {
            lstStrs.Add(seed);
            lstStrs.Add(Swap(seed, 0, 1));
        }
        return lstStrs;
    }
    //Loop counter variable to count total number of loop execution in various functions
    private static int loopCounter = 0;

    //Non recursive  version of permuation function
    public static List<string> Permutate(string seed)
    {
        loopCounter = 0;
        List<string> strList = new List<string>();
        strList.Add(seed);
        for (int i = 0; i < seed.Length; i++)
        {
            int count = strList.Count;
            for (int j = i + 1; j < seed.Length; j++)
            {
                for (int k = 0; k < count; k++)
                {
                    strList.Add(Swap(strList[k], i, j));
                    loopCounter++;
                }
            }
        }
        Trace.WriteLine("Loop counter :" + loopCounter);
        return strList;
    }

    private static string Swap(string seed, int p, int p2)
    {
        Char[] chars = seed.ToCharArray();
        char temp = chars[p2];
        chars[p2] = chars[p];
        chars[p] = temp;
        return new string(chars);
    }
}

0

এখানে একটি সি # উত্তর যা সামান্য সরলীকৃত।

public static void StringPermutationsDemo()
{
    strBldr = new StringBuilder();

    string result = Permute("ABCD".ToCharArray(), 0);
    MessageBox.Show(result);
}     

static string Permute(char[] elementsList, int startIndex)
{
    if (startIndex == elementsList.Length)
    {
        foreach (char element in elementsList)
        {
            strBldr.Append(" " + element);
        }
        strBldr.AppendLine("");
    }
    else
    {
        for (int tempIndex = startIndex; tempIndex <= elementsList.Length - 1; tempIndex++)
        {
            Swap(ref elementsList[startIndex], ref elementsList[tempIndex]);

            Permute(elementsList, (startIndex + 1));

            Swap(ref elementsList[startIndex], ref elementsList[tempIndex]);
        }
    }

    return strBldr.ToString();
}

static void Swap(ref char Char1, ref char Char2)
{
    char tempElement = Char1;
    Char1 = Char2;
    Char2 = tempElement;
}

আউটপুট:

1 2 3
1 3 2

2 1 3
2 3 1

3 2 1
3 1 2

0

এটি আমার সমাধান যা এটি আমার পক্ষে বোঝা সহজ

class ClassicPermutationProblem
{
    ClassicPermutationProblem() { }

    private static void PopulatePosition<T>(List<List<T>> finalList, List<T> list, List<T> temp, int position)
    {
         foreach (T element in list)
         {
             List<T> currentTemp = temp.ToList();
             if (!currentTemp.Contains(element))
                currentTemp.Add(element);
             else
                continue;

             if (position == list.Count)
                finalList.Add(currentTemp);
             else
                PopulatePosition(finalList, list, currentTemp, position + 1);
        }
    }

    public static List<List<int>> GetPermutations(List<int> list)
    {
        List<List<int>> results = new List<List<int>>();
        PopulatePosition(results, list, new List<int>(), 1);
        return results;
     }
}

static void Main(string[] args)
{
    List<List<int>> results = ClassicPermutationProblem.GetPermutations(new List<int>() { 1, 2, 3 });
}

0

এখানে আলগো বর্ণিত আরও একটি বাস্তবায়ন রয়েছে।

public class Program
{
    public static void Main(string[] args)
    {
        string str = "abcefgh";
        var astr = new Permutation().GenerateFor(str);
        Console.WriteLine(astr.Length);
        foreach(var a in astr)
        {
            Console.WriteLine(a);
        }
        //a.ForEach(Console.WriteLine);
    }
}

class Permutation
{
    public string[] GenerateFor(string s)
    {  

        if(s.Length == 1)
        {

            return new []{s}; 
        }

        else if(s.Length == 2)
        {

            return new []{s[1].ToString()+s[0].ToString(),s[0].ToString()+s[1].ToString()};

        }

        var comb = new List<string>();

        foreach(var c in s)
        {

            string cStr = c.ToString();

            var sToProcess = s.Replace(cStr,"");
            if (!string.IsNullOrEmpty(sToProcess) && sToProcess.Length>0)
            {
                var conCatStr = GenerateFor(sToProcess);



                foreach(var a in conCatStr)
                {
                    comb.Add(c.ToString()+a);
                }


            }
        }
        return comb.ToArray();

    }
}

new Permutation().GenerateFor("aba")ফলাফলstring[4] { "ab", "baa", "baa", "ab" }
এটমোস্ক

0
    //Generic C# Method
            private static List<T[]> GetPerms<T>(T[] input, int startIndex = 0)
            {
                var perms = new List<T[]>();

                var l = input.Length - 1;

                if (l == startIndex)
                    perms.Add(input);
                else
                {

                    for (int i = startIndex; i <= l; i++)
                    {
                        var copy = input.ToArray(); //make copy

                        var temp = copy[startIndex];

                        copy[startIndex] = copy[i];
                        copy[i] = temp;

                        perms.AddRange(GetPerms(copy, startIndex + 1));

                    }
                }

                return perms;
            }

            //usages
            char[] charArray = new char[] { 'A', 'B', 'C' };
            var charPerms = GetPerms(charArray);


            string[] stringArray = new string[] { "Orange", "Mango", "Apple" };
            var stringPerms = GetPerms(stringArray);


            int[] intArray = new int[] { 1, 2, 3 };
            var intPerms = GetPerms(intArray);

এই কোডটি এখানে একা রেখে না রেখে এই কোডটি কীভাবে কাজ করে সে সম্পর্কে যদি আপনি কিছুটা ব্যাখ্যা করতে পারেন তবে দুর্দান্ত হবে great
iBug

-1
    /// <summary>
    /// Print All the Permutations.
    /// </summary>
    /// <param name="inputStr">input string</param>
    /// <param name="strLength">length of the string</param>
    /// <param name="outputStr">output string</param>
    private void PrintAllPermutations(string inputStr, int strLength,string outputStr, int NumberOfChars)
    {
        //Means you have completed a permutation.
        if (outputStr.Length == NumberOfChars)
        {
            Console.WriteLine(outputStr);                
            return;
        }

        //For loop is used to print permutations starting with every character. first print all the permutations starting with a,then b, etc.
        for(int i=0 ; i< strLength; i++)
        {
            // Recursive call : for a string abc = a + perm(bc). b+ perm(ac) etc.
            PrintAllPermutations(inputStr.Remove(i, 1), strLength - 1, outputStr + inputStr.Substring(i, 1), 4);
        }
    }        
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.