使用插入的字符创建字符串的所有可能变体

时间:2014-01-06 03:19:36

标签: javascript

我正在尝试使用变量email并使用“。”创建所有可能的组合。就像这样:

结果

andrew
andre.w
andr.ew
andr.e.w
and.rew
and.re.w
and.r.ew
and.r.e.w
an.drew
an.dre.w
an.dr.ew
an.dr.e.w
an.d.rew
an.d.re.w
an.d.r.ew
an.d.r.e.w
a.ndrew
a.ndre.w
a.ndr.ew
a.ndr.e.w
a.nd.rew
a.nd.re.w
a.nd.r.ew
a.nd.r.e.w
a.n.drew
a.n.dre.w
a.n.dr.ew
a.n.dr.e.w
a.n.d.rew
a.n.d.re.w
a.n.d.r.ew
a.n.d.r.e.w

我不确定如何做到这一点。我知道如何使用循环遍历每个角色,但就其余部分而言,我很难过。我正在查看substrslice以及其他一些功能,但无法正常工作。

代码

var email = "andrew";

for (var i = 0; i < email.length; i++) {
    console.log( email[i] + "." );
}

4 个答案:

答案 0 :(得分:3)

这很简单:

var str = 'andrew';

var results = [],
    bin;

for (var i = 0; i < Math.pow(2, str.length - 1); ++i) {
    bin = i.toString(2).split('').reverse().join('');
    results.push(str.replace(/./g, function(letter, index) {
        if (bin.charAt(index) == 1) {
            letter += '.';
        }
        return letter;
    }));
}

console.log(results);

演示:http://jsfiddle.net/9qLY6/

简短说明:

对于'abc'字符串,点字符有2个位置:ab之间; bc。这两个位置可以表示为二进制数的数字。在这种情况下,所有可能的组合是:

  • 00
  • 01
  • 10
  • 11

如果您将1视为 - .,而0视为没有.,则可以迭代2^(n-1)个数字并放置{{ 1}}如果设置了相应的位。

答案 1 :(得分:2)

如果您对Dinesh提到的递归解决方案感兴趣,可以使用以下代码来帮助您入门。

function withPeriods(str, prev) {
    prev = prev || '';
    if(!str || str.length == 0) {
        return prev ? [prev] : [];
    } else if(str.length == 1) {
        return [prev + str];
    } else {
        var c = str.charAt(0);
        var newStr = str.slice(1);
        return withPeriods(newStr, prev+c).concat(withPeriods(newStr, prev+c+'.'));
    }
}

这里的想法是你正在通过字符串,保持当前结果在'prev'变量。如果字符串的长度为0或1,则没有什么可做的。否则,您需要考虑两个选项:一个是从'str'中取一个字符并将其添加到'prev',另一个是你做的,但也添加一个'。'

答案 2 :(得分:1)

如果您考虑一下,您需要在字符串中的每个可能位置(任意两个字符之间)插入一个点或不插入一个点。一个时髦的方法是要意识到,如果你有n个字符,那么就有n-1个地方。如果您编写了period = 1no period = 0的组合,那么您可以将所有可能的解决方案编写为2 ^ n-1二进制序列。显示四个字母的单词&#34; word&#34;:

000    word
001    wor.d
010    wo.rd
011    wo.r.d
100    w.ord
101    w.or.d
110    w.o.rd
111    w.o.r.d

在伪代码中(现在不能测试JS语法):

n = strlen( email );
combinations = 1 << n - 1;  // left shift operation
for i = 0 to combinations - 1:
  dot = 1
  for j = 0 to n:
    print email[j];
    if dot & i:
      print '.'
    dot << 1;

你能从这里拿走吗?

答案 3 :(得分:0)

您可能会采用递归方法解决此问题。也许您可以将基本案例用作包含2个字符的字符串。