2010-08-11 48 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 2010-08-11 00:22:03

+0

@quantumSoup:它基于任意规则,我无法控制,哪些可能会在将来发生变化 – Jon 2010-08-11 00:26:29

+0

另请注意,这看起来有点像背包问题,它是NP完全的(换句话说,解决方案效率低) – quantumSoup 2010-08-11 00:28:07

回答

0

首先,我将它转换为字符串数组。然后遍历你的选项,看看哪个置换实际上适合你的maxLength。

由于quantumSoup评论 - 你没有提到你的消除标准,但是一旦你有了这个定义,根据你的优先级标准,通过消除特定的数组索引很容易迭代选项。

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

如果忽略字符串的顺序是任意的,我会尝试构造按优先级排序的某种类型的列表。然后,我会按照列表工作,直到填充完输出缓冲区。如果像你说的那样,优先级是外部定义的并且是任意的,那么你可以用常数表来驱动它。