`
银辰宇
  • 浏览: 4351 次
文章分类
社区版块
存档分类
最新评论

如何生成字符串的所有可能排列的列表?

阅读更多
我将如何生成包含变量字符列表的长度在x和y字符之间的字符串的所有可能排列的列表?任何语言都可以使用,但它必须是可移植的。

有几种方法可以做到这一点。常用方法使用递归,memoization或动态编程。基本思想是您生成一个长度为1的所有字符串的列表,然后在每次迭代中,对于在上一次迭代中生成的所有字符串,将该字符串与字符串中的每个字符分别连接起来。(下面代码中的变量索引跟踪最后一次和下一次迭代的开始)

一些代码:

list = originalString.split('')
index = (0,0)
list = [""]
for iteration n in 1 to y:
  index = (index[1], len(list))
  for string s in list.subset(index[0] to end):
    for character c in originalString:
      list.add(s + c)
然后你需要删除长度小于x的所有字符串,它们将是列表中的第一个(x-1)* len(originalString)条目。

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

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

void print(char *a, int i, int n) {
    int j;
    if(i == n) {
        printf("%s\n", a);
    } else {
        for(j = i; j <= n; j++) {
            swap(a + i, a + j);
            print(a, i + 1, n);
            swap(a + i, a + j);
        }
    }
}

int main(void) {
    char a[100];
    gets(a);
    print(a, 0, strlen(a) - 1);
    return 0;
}

根据Knuth,Python示例的非递归解决方案:

def nextPermutation(perm):
    k0 = None
    for i in range(len(perm)-1):
        if perm[i]<perm[i+1]:
            k0=i
    if k0 == None:
        return None

    l0 = k0+1
    for i in range(k0+1, len(perm)):
        if perm[k0] < perm[i]:
            l0 = i

    perm[k0], perm[l0] = perm[l0], perm[k0]
    perm[k0+1:] = reversed(perm[k0+1:])
    return perm

perm=list("12345")
while perm:
    print perm
    perm = nextPermutation(perm)

这是C#中的一个简单解决方案。

它只生成给定字符串的不同排列。

    static public IEnumerable<string> permute(string word)
    {
        if (word.Length > 1)
        {

            char character = word[0];
            foreach (string subPermute in permute(word.Substring(1)))
            {

                for (int index = 0; index <= subPermute.Length; index++)
                {
                    string pre = subPermute.Substring(0, index);
                    string post = subPermute.Substring(index);

                    if (post.Contains(character))
                            continue;                      

                    yield return pre + character + post;
                }

            }
        }
        else
        {
            yield return word;
        }
    }

C ++中的递归解决方案

int main (int argc, char * const argv[]) {
        string s = "sarp";
        bool used [4];
        permute(0, "", used, s);
}

void permute(int level, string permuted, bool used [], string &original) {
    int length = original.length();

    if(level == length) { // permutation complete, display
        cout << permuted << endl;
    } else {
        for(int i=0; i<length; i++) { // try to add an unused character
            if(!used[i]) {
                used[i] = true;
                permute(level+1, original[i] + permuted, used, original); // find the permutations starting with this string
                used[i] = false;
            }
        }
}
部分资料来源:http://nhgfehf.doodlekit.com/
分享到:
评论

相关推荐

    Permutation:生成字符串的所有排列

    如果字符串有 n 个字符,(循环 'i' 从 0 到 n-1)该方法将第 'i' 个字符作为第一个字符,并根据“较短的字符串”(通过以下方式获得的字符串)的排列生成其余字符从原始字符中减去第 'i 个字符)。

    按5分割字符串,升序排列

    随机生成一串整数类型的数字,查找是否存在5,如果有5,分割开字符串。然后将分割后的字串按照升序排列。用*号分割开子字符串来表示

    生成字符串的全排列,可以用回溯法实现

    NULL 博文链接:https://yangkai.iteye.com/blog/585854

    使用C语言解决字符串全排列问题

    输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba 思路 这是典型的递归求解问题,递归算法有四个特性: 必须有可...

    character-generator:生成字符串中所有可能的字符排列

    #Description 当给定可能的范围时,此模块生成字符串中设置位置内所有可能的字符排列。 ##Usage 要插入字符的位置用“@”表示。 每个位置都必须有一个相应的范围放置在一个平面阵列中。 这些范围可以是任何形式的...

    组合数学排列生成算法之字典序法

    排列生成算法 字典序法 C语言源代码 排列生成算法的一种,采用交换和逆序的方法生成排列

    php实现根据字符串生成对应数组的方法

    主要介绍了php实现根据字符串生成对应数组的方法,包含了数组操作的技巧及eval函数的用法,需要的朋友可以参考下

    js-FCC算法-No repeats please字符串的全排列(详解)

    把一个字符串中的字符重新排列生成新的字符串,返回新生成的字符串里没有连续重复字符的字符串个数.连续重复只以单个字符为准 例如, aab 应该返回 2 因为它总共有6中排列 (aab, aab, aba, aba, baa, baa),但是只有...

    C语言重复数全排列的代码

    输入一个字符串,字符串由字母、数字组成,可能包含重复的字符。生成这些字符的不重复的全排列,并将结果打印到标准输出上。 【输入形式】 从标准输入上读入一个由字母、数字组成的字符串,字符串的长度小于...

    java关于字符串拼接的笔试题-practice:实践

    ID:需要生成受某些约束的所有排列 示例:N 皇后、数独求解器等 对于简单的游戏,可以用我的赢=你的损失递归解决 Minimax,就像投币线游戏 你有一些选择 您的价值等于……您的选择的最大值 + 其后续状态的最小值 在...

    求组合数并列出所有项

    求组合数并列出所有项,输入要求的字符串

    python-弱口令字典生成器(20行代码)

    具体来说,它使用一个含有多个元素的列表,其中包含一些元素,例如'root'、'admin'、'password'等,根据这些元素生成排列组合,再将所有的可能性输出为字符串类型的结果,并写入到文件中。该工具生成的字典文件名为...

    二维码(QRcode)生成算法 C语言/C++源码

    1. 根据输入字符串识别编码模式; 2. 根据输入字符串长度选择合适的QRcode版本; 3. 将编码转换为二进制位流表示为数据码字; 4. 使用多项式生成纠错码; 5. 将数据码和纠错码排列到二维码上; 6. 加入定位符号、...

    react-element-to-jsx-string:将ReactElement变成相应的JSX字符串

    react-element-to-jsx字符串 将ReactElement变成相应的JSX字符串。 对于单元测试和您可能想到的任何其他需求很有用。 特征: 支持嵌套和深层嵌套,例如&lt;div a={{b:&gt;}}}} /&gt; props:支持字符串,数字,函数(以prop={...

    随机生成10位数包含字母和数字

    随机生成10位随机排列 的字符串,包含字母和数字的随机排列

    排列组合.zip

    字符串匹配算法:字符串匹配算法用于在一个字符串(文本)中查找一个子串(模式)的出现位置。常见的字符串匹配算法包括暴力匹配、KMP算法、Boyer-Moore算法等。 这些是计算机科学中常见的算法类型,每种算法都有...

    乱数排列.zip

    字符串匹配算法:字符串匹配算法用于在一个字符串(文本)中查找一个子串(模式)的出现位置。常见的字符串匹配算法包括暴力匹配、KMP算法、Boyer-Moore算法等。 这些是计算机科学中常见的算法类型,每种算法都有...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    varchar2 1~4000字节 可变长度字符串,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但查询效率没有char类型高 数值类型 Number(m,n) m(1~38) n(-84~127) 可以存储正数、负数、零、定点数和精度为38位的浮点数...

    串口调试,北斗短信,二维码生成器源代码

    增加预定义字符串页面数量自定义功能,可以设置1-10页预定义字符串页。 2016-12-15 2.0.1.9:集成北斗RDSS调试环境。 2016-12-08 2.0.1.7:增加对长文本发送的支持,比文本文件发送更直观。 2016-12-07 2.0.1.6:...

Global site tag (gtag.js) - Google Analytics