2015-10-14 42 views
1

我有一個字符串ch,我想要得到一個特定的輸出out。請看下面的例子。得到單詞的不同組合

ch <- "A B" 
out <- "A B AB" 

ch <- "A B C" 
out <- "A B C AB BC AC ABC" 

ch <- "A B C D" 
out <- "A B C D AB BC CD AC AD BD ABC ABD ACD BCD ABCD" 

基本上我想要得到所有可能的前進的組合出現在字符串中的所有單詞如上所述。

如何在R中以最簡單的方式實現此目的?

編輯:

我試過下面。但它似乎給了所有可能的組合,在這種情況下,將很難過濾掉我需要的情況。

e <- c("A", "B", "C") 
> r <- expand.grid(e, e, e) 
> r 
    Var1 Var2 Var3 
1  A A A 
2  B A A 
3  C A A 
4  A B A 
5  B B A 
6  C B A 
7  A C A 
8  B C A 
9  C C A 
10 A A B 
11 B A B 
12 C A B 
13 A B B 
14 B B B 
15 C B B 
16 A C B 
17 B C B 
18 C C B 
19 A A C 
20 B A C 
21 C A C 
22 A B C 
23 B B C 
24 C B C 
25 A C C 
26 B C C 
27 C C C 

回答

2

一種選擇是向split由空間(strsplit(str1, ' ')),循環通過「V1」的長度的序列串,得到的「V1」的combn用於序列,paste在輸出列中的元素(apply(..., 2, ...)) ,unlistpaste再次,我們可以創建一個函數(「F1」),做這些並用它來多串

f1 <- function(str1){ 
    v1 <- strsplit(str1, ' ')[[1]] 
    paste(unlist(sapply(seq(length(v1)), function(i) 
     apply(combn(v1, i), 2, paste, collapse=""))), collapse= ' ') 
    } 

ch <- "A B" 
f1(ch) 
#[1] "A B AB" 

ch <- "A B C"  
f1(ch) 
#[1] "A B C AB AC BC ABC" 

ch <- "A B C D" 
f1(ch) 
#[1] "A B C D AB AC AD BC BD CD ABC ABD ACD BCD ABCD" 
0

下面的例子給你字符串的所有可能的組合:

public class StringCombinations 
{ 
    private StringBuilder output = new StringBuilder(); 
    private final String inputstring; 

    public StringCombinations(final String str) 
    { 
     inputstring = str; 
     System.out.println("The input string is : " + inputstring); 
    } 

    public static void main(String args[]) 
    { 
     String str = "a b c d"; 
     String string = str.replaceAll("\\s+", ""); 
     StringCombinations combobj = new StringCombinations(string); 
     System.out.println("All possible combinations are : "); 
     combobj.combine(); 
    } 

    public void combine() 
    { 
     combine(0); 
    } 

    private void combine(int start) 
    { 
     for (int i = start; i < inputstring.length(); ++i) 
     { 
      output.append(inputstring.charAt(i)); 
      System.out.println(output); 
      if (i < inputstring.length()) 
       combine(i + 1); 
      output.setLength(output.length() - 1); 
     } 
    } 
}