查找没有重复的字符串的排列[重复]

Posted

技术标签:

【中文标题】查找没有重复的字符串的排列[重复]【英文标题】:Finding Permutations of Strings with no Repeats [duplicate] 【发布时间】:2014-04-17 23:06:06 【问题描述】:

我已经在这个论坛here 上发布了这个问题,但是看到没有人回答我决定在这里尝试。

基本上,我正在寻找一种方法来置换给定范围内的整数数组,而不会重复排列。过去我很难理解如何找到排列,所以我希望有人可以深入解释我需要实现什么以及为什么。

这是我现在的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define LENGTH 2

double NumberOfPermuationsOfString( int length, char minimum, char maximum )

    return pow( ( maximum - minimum ) + 1, length );


int NextPermutation( char * buffer, char minimum, char maximum )

    const size_t length = strlen( buffer ) + 1;

    int i = 0;

    for ( ; i < length; ++i )
    
        /* I don't know what to do here... */
    

    return 0;


void DisplayPermutations( int length, char minimum, char maximum )

    char buffer[( length + 1 )];
    memset( buffer, 0, sizeof( buffer ) );
    memset( buffer, minimum, sizeof( buffer ) - 1 );

    int i = 0;

    do
    
        printf( "%s\n", buffer );
     while ( NextPermutation( &buffer[0], minimum, maximum ) );


int main( )

    printf( "Iterating through %0.lf permuations...\n", NumberOfPermuationsOfString( LENGTH, 'a', 'z' ) );
    DisplayPermutations( LENGTH, 'a', 'z' );

    return 0;

这不是 C#,不要让命名约定欺骗了您...

【问题讨论】:

“没有重复排列”是什么意思?你打算把 1,2,3 和 3,2,1 一样对待吗? 我不想有“abc”一次,然后再出现。这又是怎么重复的?这不是 C#... 嗯,C,但我想说的是它适用于 C++。 【参考方案1】:

Fabulous Adventures in Coding blog 的作者 Eric Lippert 在Producing Permutations 上有一个很好的系列。

在解释中,他提供了代码。例如,part four 中的以下 sn-p 执行您想要的操作 并且 允许随机访问(但使用自定义类型):

public static Permutation NthPermutation(int size, BigInteger index)

  if (index < 0 || index >= Factorial(size))
    throw new ArgumentOutOfRangeException("index");
  if (size == 0) // index must be zero since it is smaller than 0!
    return Empty;
  BigInteger group = index / size; // What block are we in?
  Permutation permutation = NthPermutation(size - 1, group);
  bool forwards = group % 2 != 0; // Forwards or backwards?
  int insert = (int) (index % size); // Where are we making the insert?                      
  return new Permutation(
    permutation.InsertAt(forwards ? insert : size - insert - 1, size - 1));

【讨论】:

我没有在 C# 中执行此操作...这意味着我无法访问此类方法。 您应该能够提取底层逻辑并将其转换为 C++。

以上是关于查找没有重复的字符串的排列[重复]的主要内容,如果未能解决你的问题,请参考以下文章

DELPHI清除TXT文件内重复字符串

剑指Offer 38 - 字符串的排列

查找字符串中重复单词的索引[重复]

从给定字符串中查找长度为 k 的所有排列/组合

字符串字母的排列:如何去除重复排列?

优化一个简单的缺失词算法[重复]