我将如何生成包含变量字符列表的长度在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 个字符,(循环 'i' 从 0 到 n-1)该方法将第 'i' 个字符作为第一个字符,并根据“较短的字符串”(通过以下方式获得的字符串)的排列生成其余字符从原始字符中减去第 'i 个字符)。
随机生成一串整数类型的数字,查找是否存在5,如果有5,分割开字符串。然后将分割后的字串按照升序排列。用*号分割开子字符串来表示
NULL 博文链接:https://yangkai.iteye.com/blog/585854
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba 思路 这是典型的递归求解问题,递归算法有四个特性: 必须有可...
#Description 当给定可能的范围时,此模块生成字符串中设置位置内所有可能的字符排列。 ##Usage 要插入字符的位置用“@”表示。 每个位置都必须有一个相应的范围放置在一个平面阵列中。 这些范围可以是任何形式的...
排列生成算法 字典序法 C语言源代码 排列生成算法的一种,采用交换和逆序的方法生成排列
主要介绍了php实现根据字符串生成对应数组的方法,包含了数组操作的技巧及eval函数的用法,需要的朋友可以参考下
把一个字符串中的字符重新排列生成新的字符串,返回新生成的字符串里没有连续重复字符的字符串个数.连续重复只以单个字符为准 例如, aab 应该返回 2 因为它总共有6中排列 (aab, aab, aba, aba, baa, baa),但是只有...
输入一个字符串,字符串由字母、数字组成,可能包含重复的字符。生成这些字符的不重复的全排列,并将结果打印到标准输出上。 【输入形式】 从标准输入上读入一个由字母、数字组成的字符串,字符串的长度小于...
ID:需要生成受某些约束的所有排列 示例:N 皇后、数独求解器等 对于简单的游戏,可以用我的赢=你的损失递归解决 Minimax,就像投币线游戏 你有一些选择 您的价值等于……您的选择的最大值 + 其后续状态的最小值 在...
求组合数并列出所有项,输入要求的字符串
具体来说,它使用一个含有多个元素的列表,其中包含一些元素,例如'root'、'admin'、'password'等,根据这些元素生成排列组合,再将所有的可能性输出为字符串类型的结果,并写入到文件中。该工具生成的字典文件名为...
1. 根据输入字符串识别编码模式; 2. 根据输入字符串长度选择合适的QRcode版本; 3. 将编码转换为二进制位流表示为数据码字; 4. 使用多项式生成纠错码; 5. 将数据码和纠错码排列到二维码上; 6. 加入定位符号、...
react-element-to-jsx字符串 将ReactElement变成相应的JSX字符串。 对于单元测试和您可能想到的任何其他需求很有用。 特征: 支持嵌套和深层嵌套,例如<div a={{b:>}}}} /> props:支持字符串,数字,函数(以prop={...
随机生成10位随机排列 的字符串,包含字母和数字的随机排列
字符串匹配算法:字符串匹配算法用于在一个字符串(文本)中查找一个子串(模式)的出现位置。常见的字符串匹配算法包括暴力匹配、KMP算法、Boyer-Moore算法等。 这些是计算机科学中常见的算法类型,每种算法都有...
字符串匹配算法:字符串匹配算法用于在一个字符串(文本)中查找一个子串(模式)的出现位置。常见的字符串匹配算法包括暴力匹配、KMP算法、Boyer-Moore算法等。 这些是计算机科学中常见的算法类型,每种算法都有...
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:...