0

我有一个字符串“子弹武器对盔甲的伤害较小。” 并且有条件这个字符串必须根据参数 int width=20 以不同的方式分成几部分。

1.wraps 给定特定宽度的文本。

“子弹武器对装甲的伤害较小。” 变成

"Bullet weapons do le"
"ss damage against ar"
"mor."
  1. 包装给定特定宽度的文本,但除非绝对必要,否则不会拆分单词。

    “子弹武器对装甲的伤害较小。” 变成

    “子弹武器对”“盔甲”造成的伤害较小。

3.给定宽度的文本,除非绝对必要,否则不会拆分单词。换行时,此函数将尝试使线条在宽度方面尽可能均匀。

"Bullet weapons do less damage against armor." becomes

"Bullet weapons "
"do less damage "
"against armor."

对于案例1:我写的逻辑如下:

     int len=text.length();   where text is string text= "Bullet weapons do less damage     against armor."

int last=0,first=0;

    vector<string> output;



int max=ceil((double)len/width);
cout<<max<<endl;



for(int i=0;i<max;i++)
{

    first=width*i;
    if(len<(width+(width*i)))
    {
        last=len;
    }
    else
    {
        last=width+(width*i);
    }


    string s(text,first,last);
    output.push_back(s);


}

但它给我的结果是:

子弹武器对盔甲的伤害较小。铁道部 在第二行中,它应该达到“ ss 对 ar 的伤害”,其中逻辑错误;

情况(2)和(3)怎么样。

请帮帮我

谢谢

4

3 回答 3

0

构造函数的第三个参数是要构造的字符串的长度,而不是最后一个字符的偏移量。

于 2013-06-29T03:26:29.897 回答
0

案例1:正如其他人已经指出的那样,您示例中的字符串构造函数略有错误,该行应该是:

string s(text,first,width);

情况 2:我建议从等于最大允许宽度的子字符串开始,然后向后搜索空格,如下所示:

while (!text.empty())
{
    // Search backwards for a space. If we don't find one, break at the
    // maximum width.
    size_t line_width = text.rfind(' ', width - 1);
    if (line_width == string::npos)
    {
        line_width = width;
    }

    string current_line(text, 0, line_width);
    text = text.substr(line_width + 1);

    cout << current_line << endl;
}

案例 3:为此,您似乎需要以某种方式弄清楚什么宽度可以为您提供最规则长度的线条。可能有几种方法可以做到这一点,但我想到的解决方案是多次运行算法,每次减小宽度,每次跟踪每条线比那个宽度短多少(称之为“宽度区别”)。解决方案是总宽度差最小的线集。

vector<string> best_line_set;
size_t best_total_width_difference = std::numeric_limits<size_t>::max();

for (j = width; j > 4; --j)
{
    string original_text(text);

    vector<string> current_line_set;
    size_t current_total_width_difference = 0;

    while (!text.empty())
    {
        // Search backwards for a space. If we don't find one, break at the
        // maximum width.
        size_t line_width = text.rfind(' ', j - 1);
        if (line_width == string::npos)
        {
            line_width = j;

            string current_line(text, 0, line_width);
            text = (line_width < text.size())
                ? text.substr(line_width)
                : "";

            current_line_set.push_back(current_line);
        }
        else
        {
            current_total_width_difference += j - line_width;

            string current_line(text, 0, line_width);
            text = (line_width + 1  < text.size())
                ? text.substr(line_width + 1)
                : "";

            current_line_set.push_back(current_line);
        }
    }

    if (current_total_width_difference < best_total_width_difference)
    {
        best_line_set = current_line_set;
        best_total_width_difference = current_total_width_difference;
    }

    text = original_text;
}

请注意,我选择了最小值 5 j- 如果最小值为 1,它几乎总是获胜,因为它的总宽度差始终为 0。您也可以考虑在总和中包含某种“足够好”的阈值,所以您不会多次循环运行以改进已经“足够好”的解决方案。

于 2013-06-29T05:31:55.253 回答
0
  1. 你应该改变

    string s(text,first,last); --> string s(text,first,width);
    
  2. 您应该考虑将字符串拆分为单词,然后将这些单词添加到另一个字符串并检查其长度。

    int i = -1;
    string word = "";
    string part = "";
    do
    {
        i = text.find(' ');
        if (i != -1)
        {
            word = text.substr(0, i);
            text = text.substr(i + 1);
            if (word.length() + part.length() < width)
            {
                part += " " + word;
            }
            else
            {
                output.push_back(part);
                cout << part << endl;
                part = word;
            }
        }
        else
        {
            word = text;
            if (word.length() + part.length() < width)
            {
                part += " " + word;
                output.push_back(part);
                cout << part << endl;
            }
            else
            {
                output.push_back(part);
                cout << part << endl;
                output.push_back(word);
                cout << word << endl;
            }
        }
    } while (i != -1);
    
  3. 在执行类似于案例 2 的操作之前,您应该重新计算宽度

于 2013-06-29T04:05:02.737 回答