我将如何生成包含变量字符列表的长度在x和y字符之间的字符串的所有可能排列的列表.
任何语言都可以使用,但它应该是可移植的.
编程访谈中的一个常见任务(不是根据我的访谈经验)是采用字符串或整数并列出每个可能的排列.
有没有这样做的例子和解决这个问题背后的逻辑?
我已经看过一些代码片段,但它们没有得到很好的评论/解释,因此难以理解.
我有n个元素.为了举个例子,让我们说,7个元素,1234567.我知道有7个!=这些7个元素可能有5040个排列.
我想要一个包含两个函数的快速算法:
f(number)将0到5039之间的数字映射到唯一的排列,并且
f'(置换)将置换映射回其生成的数字.
我不关心数字和排列之间的对应关系,只要每个排列都有自己唯一的数字.
所以,举个例子,我可能会在哪里有功能
f(0) = '1234567'
f'('1234567') = 0
Run Code Online (Sandbox Code Playgroud)
想到的最快的算法是枚举所有排列并在两个方向上创建查找表,这样,一旦创建表,f(0)将是O(1)并且f('1234567')将是查找字符串.然而,这是内存饥饿,特别是当n变大时.
任何人都可以提出另一种算法,它可以快速工作,没有内存缺点吗?
从给定数组中获取具有最小和最大长度值的所有可能字符串组合的最佳算法是什么.
注意:这增加了复杂性,因为值是可变的,与这些链接的问题不同.
例如:
$letters = array('a','b','c','1','2','3');
$min_length = 1;
$max_length = 4;
a
b
c
1
2
3
.
.
.
aaaa
a123
b123
c123
Run Code Online (Sandbox Code Playgroud) 假设我有这样的数据结构IEnumerable<IEnumerable<object>>:
{
{ A, B }
{ 1, 2, 3 }
{ Z }
}
Run Code Online (Sandbox Code Playgroud)
外部数组可以包含任意数量的内部数组.并且内部数组可以各自独立地包含任意数量的元素.并且为了简单起见,假设没有数组是空的.
我想把它变成IEnumerable<IEnumerable<object>>这样的:
{ { A, 1, Z }, { A, 2, Z }, { A, 3, Z }, { B, 1, Z }, { B, 2, Z }, { B, 3, Z } }
Run Code Online (Sandbox Code Playgroud)
其中包含原始结构中值的每个组合.因此,每个内部数组中的每个元素都通过索引映射到原始外部数组中的元素/数组.
在C#中最简单的方法是什么?
可能重复:
生成给定字符串的所有排列
我在Java中有一个任意长度的数组,我想生成它们的所有可能的排列.对固定长度执行此操作的简单方法是一系列嵌套for循环,但由于数组长度未知,因此这不是一个选项.在Java中有没有一种直接的方法来实现这一目标?
假设我们有一个字母"abcdefghiklimnop".如何以有效的方式以五组为单位递归地重复生成这种字母表的排列?
我几天来一直在努力解决这个问题.任何反馈都会有所帮助.
基本上这与以下内容相同:生成给定字符串的所有排列
但是,我只想要整个字符串的五十个长度的排列.我无法弄明白这一点.
对于"abcdefghiklimnop"长度为5的所有子串,找到子串的排列.例如,如果子字符串是abcdef,我想要它的所有排列,或者如果子字符串是defli,我会想要该子字符串的所有排列.下面的代码给出了字符串的所有排列,但我想用它来查找字符串大小为5的所有子串的所有排列.
public static void permutation(String str) {
permutation("", str);
}
private static void permutation(String prefix, String str) {
int n = str.length();
if (n == 0) System.out.println(prefix);
else {
for (int i = 0; i < n; i++)
permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, n));
}
}
Run Code Online (Sandbox Code Playgroud) 是否有算法以有限的重复列出所有排列?如果有一个现有的Java库,那就太好了!
假设我们有3个项目{A, B, C}.我们想要2个项目的排列.这将是3 P 2:
{A, B}
{A, C}
{B, A}
{B, C}
{C, A}
{C, B}
Run Code Online (Sandbox Code Playgroud)
但是如果我们允许最多重复两次.怎么会这样?(我真的不知道.)
我尝试成像,我们从集合中得到2的排列{A, A, B, B, C, C}.它将是6 P 2 = 30.但是我们必须拿走那些重复的东西.我已经手动完成它,它是9.我不知道如何从数学计算9.
{A, A}
{A, B}
{A, C}
{B, B}
{B, A}
{B, C}
{C, C}
{C, A}
{C, B}
Run Code Online (Sandbox Code Playgroud)
(事实上,重复2的3 P 2不是一个很好的例子.这是因为排列中只有2个元素.因此,无限重复之间没有差异.重复2的4 P 3将是一个更好的例子.但是很难列出所有的排列.)
一个更好的例子示例:4 P 3的集合{A, B, C, D}:
{A, B, C}
{A, B, D}
{A, …Run Code Online (Sandbox Code Playgroud) 可能重复:
生成给定字符串的所有排列
给定一个长度n=4,
和a set of characters -> {'a', 'b'},如何编写一些java代码来生成包含集合中字符的长度为n的所有可能字符串?
对于上面的示例,结果应该有2 ^ 4 = 16个字符串,即:
aaaa
aaab
aabb
abbb
baaa
baab
babb
bbbb
bbaa
bbab
bbba
abaa
abab
abba
baba
aaba
Run Code Online (Sandbox Code Playgroud)
这是我的代码片段:
public void process(String result, String string)
{
if(string.length() == 0)
{
System.out.println(result);
}else{
for(int i = 0; i < string.length(); i++)
{
String newResult = new String(result+string.charAt(i));
String newString = new String(string.substring(0,i) + string.substring(i+1, string.length()));
process(newResult, newString);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎只是做排列,而不是我想要的.......提前谢谢你:)
我正在尝试获取与输入 arrayList 长度相同的 ArrayList 的所有可能排列。即 1,2,3 的 ArrayList 将导致 123, 132, 213, 231, 321, 312,不包括更短的排列,如 1, 2, 12, 13 ... 等等。这是我到目前为止的代码:
public void getAllPermutations(ArrayList<coordinate> coords) {
ArrayList<coordinate> sub = new ArrayList<coordinate>();
permutateSub(sub, coords);
}
private ArrayList<ArrayList<coordinate>> permutateSub(ArrayList<coordinate> sub,
ArrayList<coordinate> coords) {
int n = coords.size();
if(n == 0) System.out.println(sub);
else {
if(sub.size()==n) {
System.out.println(sub);
for(int i = 0; i<n; i++) {
ArrayList<coordinate> a = new ArrayList<coordinate>(sub);
a.add(coords.get(i));
ArrayList<coordinate> b = new ArrayList<coordinate>(coords);
b.remove(i);
permutateSub(a, b);
}
}
}
Run Code Online (Sandbox Code Playgroud)
坐标是一个类,它只有 x、y …