我正在尝试使用变量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
我不确定如何做到这一点。我知道如何使用循环遍历每个角色,但就其余部分而言,我很难过。我正在查看substr
,slice
以及其他一些功能,但无法正常工作。
代码
var email = "andrew";
for (var i = 0; i < email.length; i++) {
console.log( email[i] + "." );
}
答案 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);
简短说明:
对于'abc'
字符串,点字符有2个位置:a
和b
之间; b
和c
。这两个位置可以表示为二进制数的数字。在这种情况下,所有可能的组合是:
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 = 1
和no 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个字符的字符串。