2016-12-17 2 views
0

この質問はpostのわずかな変更です。 文字列を指定すると、x個の削除文字列のベクトル を生成します。例えば:補完的な削除を生成するための文字列連結

String a = "ABCD"; 
int x = 2; 
//vector<string> residue = generate(a, x); 
//vector residue would have the following elements: 
//"AB", "BC", "CD", "AC" "AD", "BD" 

がこれをやってしまってから、私は取り除か他の2つの文字 との文字列が含まれている文字列の二 ベクトルを生成したいと思います。ただし、削除の代わりに .を挿入したいと思います。たとえば、

//vector<string> residue2 would have the following elements: 
//"..CD", "A..D", "AB..", ".B.D", ".BC.", "A.C." 

これはx = 1でこれを実行しようとしたものです。しかし、 は2番目の文字列を生成することはできません。またはxの数値は任意の数値と等しくなります。

vector<int> orignal; 
for(int i = 1; i <= 5; i++) original.push_back(i); 
vector<int> data2; 
for(int p1 = 0; p1 < length; p1++){ 
    auto data1 = original 
    data1.erase(data1.begin()+p1); 
    for(int p2 = 0; p2 < length; p2++){ 
     data2 = original; 
     if(p2 != p1) 
      data2.erase(data2.begin()+p2); 
     //do stuff 
    } 
} 

編集:私は何を達成したいことは以下の通りです:(X = 1のための私の擬似コードを参照してください) のはoriginal = {1, 2, 3}を言ってみましょう。その後、外側の最初の反復で、for-loopdata1 = {2,3}およびdata2 = {1,2,3}、次にdata2={1,2,.}。外側の2回目の反復では、for-loopdata1 = {1,3}およびdata2 = {1,2,.}、次にdata2={.,2,3}です。そして、これはもう一度data1 = {1,2}のために続きます。今、私はオリジナルから1つの要素だけを取り除いています。しかし、data1はx <の長さではxの削除を持つように一般化したいと思います。したがって、data2にはxの削除がありますが、data1でまだ削除されていない要素は系統的に削除されます。

+0

を取得leetcodeから、このですか? – Walter

+0

Btw、どうしたの? – Walter

+0

@Walter質問を更新しました。 –

答えて

0

あなたが(またはアウト表す)boolのセットのすべての順列をループにstd::next_permutation()を使用することができます。例

#include <string> 
#include <vector> 
#include <algorithm> 

std::vector<std::string> generate(std::string const&str, std::size_t x) 
{ 
    const auto size = str.size(); 
    std::vector<bool> perm(size); 
    for(std::size_t i=0; i!=size; ++i) 
    perm[i] = i>=x; 
    std::vector<std::string> result; 
    do { 
    auto copy = str; 
    for(std::size_t i=0; i!=size; ++i) 
     if(!perm[i]) copy[i]='.'; 
    result.push_back(std::move(copy)); 
    } while(std::next_permutation(perm.begin(),perm.end())); 
    return result; 
} 

について例えばstr="ABCDE"x=2のために、私たちは

{"..CDE",".B.DE",".BC.E",".BCD.","A..DE","A.C.E","A.CD.","AB..E","AB.D.","ABC.."} 
+0

これは非常に有益な答えです!ありがとうございました。しかし、私が欲しかったのは少し違っていました。私がOPにした編集が、私がもっと欲しいものを説明するのに役立つかどうか教えてください。 –

+0

申し訳ありませんが、これは*正確に*あなたが言っている*あなたが欲しいです(残渣2の場合)。おそらく、あなたは自分の要件、つまりあなたが実際に尋ねる前に*求めていたものを理解するためにもっと努力するべきでしょうか? – Walter

0

文字列の長さをnとします。 x< = n。

x 1とn-x 0の文字列を作成してください。

string your_string="..."; 
for(int i=0;i<n;i++) 
    ss+=(i<=n-x-1)?"0":"1"; 


do 
{ 
    string temp=""; 
    for(int i=0;i<=n-1;i++) 
    if(ss[i]=='1') 
     temp+="."; 
    else 
     temp+=your_string[i]; 
    /* process temp..*/ 
} 
while(next_permutation(ss.begin(),ss.end()) 

for n=3 x=2 
"ABC" 
A.. 011 
.B. 101 
..C 110