2014-01-06 67 views
0

我試圖採用變量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] + "."); 
} 

回答

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。這2個位置可以以二進制數字的數字表示。所有在這種情況下,可能的組合有:

  • 00
  • 01
  • 10
  • 11

如果你把1爲 - .那裏,0因爲沒有.有 - 你可以迭代2^(n-1)號碼如果相應的位置1,則輸入.

0

你可能需要一個遞歸的方法解決這個問題。也許你可以使用基本情況作爲一個字符串與2個字符。

1

如果您仔細考慮,您需要在字符串中的每個可能位置(任意兩個字符之間)插入一個點或不插入一個點。一個奇怪的方法來實現這一點是要意識到,如果你有n個字符,有n-1地方。如果您編寫了period = 1no period = 0的組合,則可以將所有可能的解作爲2^n-1二進制序列編寫。這顯示了一個四個字母的單詞「詞」:

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; 

你可以把它從這裏?

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'中,另一種是在那裏你添加一個'。'。

+0

也許有一個更清晰的遞歸解決方案,遵循分治征服原則:http://jsfiddle.net/epMs2/1/ – zerkms

+0

這當然更簡潔,但我不認爲它更清楚。確實是 – Nobody

+0

。對於那些喜歡功能性風格而非命令性的人來說,可能會更清楚。 – zerkms

相關問題