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. Тем не менее, я не могу генерировать вторую строку или обобщать для 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 
    } 
} 

Edit: То, что я хочу, чтобы достичь является следующее: (см мой псевдокоде при х = 1) Допустим original = {1, 2, 3}. Затем на первой итерации внешнего for-loop, data1 = {2,3} и data2 = {1,2,3} затем data2={1,2,.}. Во 2-й итерации внешнего for-loop, data1 = {1,3} и data2 = {1,2,.} затем data2={.,2,3}. И затем это продолжается еще раз для data1 = {1,2}. Теперь это когда я удаляю только один элемент из оригинала. Тем не менее, я хотел бы обобщить это так, чтобы data1 имел любые изъятия x для длины x <. И, следовательно, data2 также будет иметь удаление x, но он будет методично удалять элементы, которые еще не были удалены в data1.

+0

Является ли это от leetcode? – Walter

+0

Кстати, в чем вопрос? – Walter

+0

@Walter Я обновил вопрос. –

ответ

0

Вы можете использовать std::next_permutation() для перебора всех перестановок множества bool (представляющего внутри или вне). Например

#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's и n-x 0's.

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 
Смежные вопросы