C# 为一组字符生成所有可能的模式

C# 为一组字符生成所有可能的模式,c#,algorithm,C#,Algorithm,可能重复: 我想为一个字符串生成所有可能的唯一模式,该字符串将包含其所有字符,包括重复字符(如果有) 例如: 字符串:abc 模式:abc acb bca bac cab cba 字符串:abb 模式:abb bab bba 另外,是否有一个公式来说明一个字符串可以创建多少个唯一的模式来验证算法的有效性?到目前为止,我尝试了多种方法,但随着角色数量的增加,结果证明不可靠。您可以尝试以下方法:- using System; namespace ConsoleApplication3

可能重复:

我想为一个字符串生成所有可能的唯一模式,该字符串将包含其所有字符,包括重复字符(如果有)

例如:

字符串:abc 模式:abc acb bca bac cab cba

字符串:abb 模式:abb bab bba


另外,是否有一个公式来说明一个字符串可以创建多少个唯一的模式来验证算法的有效性?到目前为止,我尝试了多种方法,但随着角色数量的增加,结果证明不可靠。

您可以尝试以下方法:-

  using System;

  namespace ConsoleApplication3
 {
    class Permute
    {
             private void swap (ref char a, ref char b)
             {
                    if(a==b)return;
                    a^=b;
                    b^=a;
                    a^=b;
              }

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

              private void go (char[] list, int k, int m)
              {
                    int i;
                    if (k == m)
                       {
                             Console.Write (list);
                             Console.WriteLine (" ");
                        }
                    else
                         for (i = k; i <= m; i++)
                        {
                               swap (ref list[k],ref list[i]);
                               go (list, k+1, m);
                               swap (ref list[k],ref list[i]);
                        }
               }
     }

     class Class1
    {
           static void Main()
           {

                  Permute p = new Permute();
                  string c="sagiv";
                   char []c2=c.ToCharArray ();
                   /*calling the permute*/
                  p.setper(c2);
              }
       }
  }

要计算唯一排列,只需计算单词的长度,例如3到可能字符的幂。因此,如果它都是小写字符,单词长度是3,那么它就是3^26=254186582832926,因为这是英语字母组合中小写字符的数量


您可以使用递归计算所有可能的组合。

如果您从已排序的数据开始,您可以使用重复调用std::next\u排列来循环所有排列。std::next_permutation处理重复元素的情况,如abb字符串,没有问题。

我的想法与Rahul Tripathi的想法类似,但是我做了一件棘手的事情,使它能够正确地处理重复元素。在执行交换操作之前的任何时候,我们都会回过头来检查这个元素以前是否出现过。如果是重复元素,则不应执行交换操作。下面是使用c++编写的代码:

#include<iostream>

using namespace std;

bool isDupilicate(char input[],int start,int j)
{
     bool ret=false;
     for(int i=start;i<j;++i)
     {
             if(input[i]==input[j])
             {
                ret=true;
                break;
             }
     }
     return ret;
}

void swap(char& a,char &b)
{
     char temp=a;
     a=b;
     b=temp;
}

void permutation(char input[],int start,int length)
{
       if(start==length)
       {
           for(int i=0;i<length;++i)cout<<input[i];
           cout<<endl;
       }
       else 
       {
           for(int i=start;i<length;++i)
           {
                   if(isDupilicate(input,start,i))continue;
                   swap(input[i],input[start]);
                   permutation(input,start+1,length);
                   swap(input[i],input[start]);

           } 
       }          
}

int main()
{
    cout<<"Input for abb"<<endl;
    char input[3]={'a','b','b'};
    permutation(input,0,3);
    cout<<"________________"<<endl;

    cout<<"Input for abc"<<endl;
    input[2]='c';
    permutation(input,0,3);

    getchar();
    getchar();

}

检查此项以确定可以创建多少个独特的模式!希望有帮助

您正在寻找置换:您正在谈论置换,请看这里:。您将找到一种计算它们的方法,以及生成它们的许多方法。@emartel和jack–感谢你们两位向我指出这一点。看起来正是我想要的。不客气。如果答案真的对你有帮助,别忘了接受。快乐编码!!很好的解决方案!但是,如果存在重复元素,则无法正常工作!以字符串abb为例。它将输出abb两次!你是说一个三个字母的单词有2541865828329个排列?哈哈,我错了,我搞错了。我应该说17576个排列是由小写字母组成的英文字母表。26^3