2个字符串的所有排列和组合的列表

时间:2014-07-15 11:49:40

标签: linux bash shell combinations permutation

让我们说一句话

qwerty

我想要的是我需要在字符串之间插入句点(点数)。它也可以是任何其他角色。

例如,

q.werty
qw.erty
qwe.rty
qwer.ty
qwert.y

以上是1期或点。因此,对于5个字母的字符串,1个句点组合将生成5个输出。 (N-1)

现在有2个时期(2个点)(仅限2个例子):

q.w.erty
q.we.rty
q.wer.ty
q.wert.y
qw.e.rty
qw.er.ty
qw.ert.y
qwe.r.ty
qwe.rt.y
qwer.t.y

依旧......

注意:字符串中的2个字母之间不能有2个连续的点。此外,在开始角色和/或结束角色之前一定不能有一段时间。

任何人都可以为上面提供一个Shell脚本(sh,bash)来列出所有可能的组合和排列。我试过谷歌搜索并没有找到任何值得参考的内容。

编辑:关于如何在bash shell脚本上启动它的任何帮助都会很棒......

2 个答案:

答案 0 :(得分:1)

你的谜题很有趣,所以这里是一个代码:

#!/bin/bash

t=qwerty

echo '---- one dot ----'

for (( i = 1; i < ${#t}; ++i )); do
    echo "${t:0:i}.${t:i}"
done

echo '---- two dots ----'

for (( i = 1; i < (${#t} - 1); ++i )); do
    for (( j = i + 1; j < ${#t}; ++j )); do
        echo "${t:0:i}.${t:i:j - i}.${t:j}"
    done
done

输出:

---- one dot ----
q.werty
qw.erty
qwe.rty
qwer.ty
qwert.y
---- two dots ----
q.w.erty
q.we.rty
q.wer.ty
q.wert.y
qw.e.rty
qw.er.ty
qw.ert.y
qwe.r.ty
qwe.rt.y
qwer.t.y

查看Bash Manual的所有内容。

答案 1 :(得分:0)

我不会写代码,但我可以引导你找到答案。

我假设您要考虑所有可能的点数,而不仅仅是1或2,而是3,4,......,直到字符串的长度为止。

对于直到最后一个字符串中的每个字符,有两种可能性:有一个点或没有点。因此对于n字符串,存在O(2 ^(n-1))种可能性。

你可以编写一个遍历所有2 ^(n-1)种可能性的for循环。这些中的每一个对应于单个输出,字母后面带有点。

i成为for循环的迭代。然后有一个内部j循环,从1到n-1。如果j位为1,则在j字母后面加一个点。