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

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

阅读更多
我将如何生成包含变量字符列表的长度在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/
分享到:
评论

相关推荐

    列出字符串的全部排列组合

    在计算机科学中,生成字符串的所有排列组合是一项基础但重要的任务,通常用于密码学、组合优化问题以及各种搜索算法中。对于长度为n的字符串,其所有可能的排列组合数量是n!(n的阶乘),这是因为每个位置都可以独立...

    C++字符串的全部排列

    以下是使用回溯法实现C++字符串排列的伪代码: ```cpp void permute(string str, int start) { if (start == str.size()) { // 打印或处理排列 cout ; return; } for (int i = start; i (); i++) { swap...

    输出一个字符串的所有排列

    在字符串排列问题中,递归可以被用来生成所有可能的字符排列。 下面,我们将详细讨论如何用递归实现字符串排列: 1. **基本情况**:当字符串长度为1时,只有一个字符,所以它本身就是唯一的排列,这就是递归的终止...

    字符串排列组合

    在编程领域,字符串排列组合是一个常见的算法问题,它涉及到如何生成一个字符串的所有可能的排列方式。这个主题主要与计算机科学的算法设计和技术有关,尤其是在数据结构和算法分析的课程中经常遇到。本节将深入探讨...

    字符串排列问题,不含重复

    在提供的文件名列表中,`Tree.c`和`hr.c`可能包含了实现某种数据结构或算法的代码,而`Tree.h`可能是对应的头文件,它们可能与字符串排列问题的解决方案无关,因为通常解决此类问题不需要特定的数据结构,除非需要...

    字符串重新排序

    因此,我们在生成新字符串时,可能需要使用StringBuilder或StringBuffer类,它们提供了动态构建字符串的能力,这对于大量操作字符串时的性能至关重要。 总的来说,解决这个问题需要对字符串操作、排序算法、条件...

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

    标题中的“生成字符串的全排列,可以用回溯法实现”是指在计算机科学中解决组合问题的一种常见算法——回溯法。回溯法是一种试探性的解决问题方法,它尝试逐步构建解决方案,如果在某一步发现无法得到有效解时,则...

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

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

    输入一个字符串,输出所有该字符串的组合情况

    标题 "输入一个字符串,输出所有该字符串的组合情况" 涉及的主要知识点是字符串处理和算法,特别是组合和排列的生成。在这个问题中,我们需要编写程序来生成一个给定字符串的所有可能的子序列或子字符串,这通常涉及...

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

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

    C#查找字符串所有排列组合的方法

    递归处理使得我们可以解决任何长度的字符串排列问题,而循环则确保了所有可能的字符交换都被考虑在内。 在实际应用中,这个方法可能会对较长的字符串产生大量的排列,因此需要注意性能优化。例如,可以通过使用`...

    36.字符串的排列1

    总之,这个解决方案展示了如何利用深度优先搜索来解决全排列问题,通过递归和回溯生成所有可能的字符串排列,并将其存储在一个有序的向量中。这种方法在理解和实现上都相对直观,但需要注意对大字符串时可能出现的...

    (ABCDE)字符串排序

    标题 "(ABCDE)字符串排序" 描述了一个使用C++编程语言实现字符串排列的问题。通过四种不同的模板和系统函数,特别是利用`string_permutation`方法,我们可以生成一个字符串的所有可能排列。这种排列通常涉及到...

    16进制字符串显示图片工具

    6. **用户界面设计**:创建一个用户友好的界面,让用户可以输入或粘贴16进制字符串,同时展示生成的图片。 7. **异常处理**:考虑到输入的16进制字符串可能不合法或不足以构成一个完整的图像,需要添加适当的错误...

    数据结构和算法:字符串

    在某些编程语言中,字符串可能以字符数组的形式存储,而在另一些语言中则可能是一个内置的数据类型。此外,对字符串的遍历、比较以及修改操作等都可能影响算法的实现和效率。 总的来说,字符串处理是计算机编程中的...

    C语言实现输入一个字符串后打印出该字符串中字符的所有排列

    在C语言中,实现输入一个字符串并打印出其所有字符排列的方法涉及到经典的排列组合问题,通常采用递归的方式来解决。这种算法称为全排列(Permutation)算法,它能生成一个集合的所有可能排列。这里我们将详细讲解...

    java 字符串a-z排序

    在Java编程语言中,对字符串中的字符进行a到z排序是一项常见的操作,特别是在处理文本数据或需要对字母顺序排列的场景。本知识点将详细讲解如何实现这个功能。 首先,我们需要理解字符串在Java中的本质。在Java中,...

    PHP多个字符串排列组合的算法,组二,组三

    在PHP编程语言中,处理字符串的排列组合是常见的任务,特别是在数据分析、彩票系统或其他需要生成所有可能结果的场景中。本篇文章将详细讲解如何利用PHP实现字符串的组合算法,特别是针对“组二”和“组三”的组合...

Global site tag (gtag.js) - Google Analytics