2010-08-11 4 views
0

Я пишу функцию, которая объединяет различные числа строк в зависимости от их длины.Конкатенация различных шаблонов строки

Вот некоторые C++, как псевдо-код, что я сейчас делаю:

string foo(size_t maxLength) 
{ 
    string a, b, c, d, e, ret; 

    //...assign them 

    if(a.size() + b.size() + c.size() + d.size() + e.size() <= maxLength) 
    { 
     ret = a + b + c + d + e; 
    } 
    else if(a.size() + c.size() + d.size() + e.size() <= maxLength) 
    { 
     LOG << "B was removed."; 
     ret = a + c + d + e; 
    } 
    else if(a.size() + b.size() + c.size() + d.size() <= maxLength) 
    { 
     LOG << "E was removed"l 
     ret = a + b + c + d; 
    } 
    //... a large amount of code like the above 

    return ret;  
} 

Есть хороший способ очистить это?

Спасибо.

+1

Как вы решаете, какой из них удаляется, если он не подходит maxLength? – quantumSoup

+0

@quantumSoup: Он основан на произвольных правилах, которые я не могу контролировать и которые могут измениться в будущем. – Jon

+0

Также обратите внимание, что это немного похоже на проблему Knapsack, которая является NP-полной (другими словами, решение будет неэффективным) – quantumSoup

ответ

0

Во-первых, я бы преобразовал его в массив строк. Затем проведите по вашим параметрам и посмотрите, какая перестановка действительно соответствует вашей максимальной длине.

Как прокомментировал квантSoup - вы не указали свои критерии для устранения, но как только вы определили это, легко выполнить итерацию опций путем исключения конкретных индексов массива в соответствии с вашим критерием приоритета.

0

Если вы просто хотите, чтобы очистить его визуально, что-то вроде:

string a, b, c, d, e, ret, temp; 

    //...assign them 

    temp = a + b + c + d + e; 
    if(temp.length <= maxLength) { 
     LOG << "none removed"; 
     ret = temp; 
    } 

    temp = a + b + c + d; 
    if(temp.length <= maxLength) { 
     LOG << "e removed"; 
     ret = temp; 
    }  

    temp = a + b + c + e; 
    if(temp.length <= maxLength) { 
     LOG << "d removed"; 
     ret = temp; 
    } 

    //... etc 

    return ret; 

Как уже упоминалось ysap, вы можете оптимизировать его с петлями, если у вас есть критерии исключения.

0

Если заказ на исключение строк произволен, я попытался бы построить список какого-то рода, упорядоченный по приоритету. Затем я проделаю свой путь через список, пока не заполнил выходной буфер. Если, как вы говорите, приоритеты определяются извне и произвольны, вы, вероятно, можете управлять им с постоянной таблицей.

Смежные вопросы