Text Justification 实现两端对齐功能 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

    实现office word中的两端对齐功能,

Text Justification 实现两端对齐功能

    只有个单词时,右边补齐空格。最后一行每个词间一个空格,整下的空格右边补齐。给定字符串,和每行的字符数L。进行两端对齐输出。

    我的思路是写一个函数,给定相应的参数就返回该行的string。然后在主函数里只要负责给参数就好了。参数包括words字符串数组本身,然后每个字符串的长度数组。开始start记录从字符串数组只的那个词开始,end记录到哪个词结束。L就是每行的最大字符数。在子函数里实现如果是最后一个单词了,那么就每个词空一个空格。其余后面补齐。在主函数里通过记录start到目前的长度是否等于或者超过L来判断start和end。如果end超过了长度就结束,返回结果即可。代码有点复杂。将近100行。调了9次bug终究AC了。

    复制代码

    class Solution {

    public:

    // 给定相应的参数,返回该行字符串满足右对齐

    string fun68(vector &words, int len[], int start, int end, int L)

    {

    if(start == end)

    {

    string subans = words[start];

    for (int i = 0; i < L - len[start]; ++i)

    subans += ' ';

    return subans;

    }

    string ans = "";

    int tolen = 0, inter = 0; // 词的长度tolen,两个词之间的空格inter

    for (int i = start; i <= end; i++)

    {

    tolen += len[i];

    }

    int left = L - tolen;

    inter = left / (end - start);

    int times = left - inter * (end - start);//剩times个空格需要在前times个词间加一个空格

    if(end == words.size() -1) // 如果是最后一个了,那么每个单词空一格单词,剩下的空格放在最后边

    {

    for (int i = start; i < words.size() - 1; i++)

    {

    ans += words[i] + ' ';

    }

    ans += words[end];

    left -= (end - start);

    for (int i = 0; i < left; i++)

    ans += ' ';

    }

    else // 否则就是平均分空格

    {

    for (int i = start; i

    {

    ans += words[i];

    for (int j = 0; j < inter + 1; ++j)

    {

    ans += " ";

    }

    }

    for (int i = start + times; i < end; ++i) // 多出来的不能平均分的空格从左边开始分

    {

    ans += words[i];

    for (int j = 0; j < inter; ++j)

    {

    ans += " ";

    }

    }

    ans += words[end];

    }

    return ans;

    }

    //主函数

    vector fullJustify(vector &words, int L)

    {

    vector ans;

    if (words.size() == 0)

    {

    return ans;

    }

    int n = words.size();

    int *len = new int[n];

    for (int i = 0; i < n; ++i)

    {

    len[i] = words[i].size();

    }

    int sum1 = len[0], sum2 = 0, start = 0, end = 0; // sum1记录从start开始的词到end的包括空格的长度

    string tmp = "";

    while (1)

    {

    if (sum1 == L || sum1 + 1 == L) // 如果有满足刚好等于L,那么就是要输出一行了

    {

    ans.push_back(fun68(words, len, start, end, L));

    start = end + 1;

    end = end + 1;

    if(end < n)// 没输出一行要相应的该sum的值,相当于重新计算过

    {

    sum1 = len[end];

    sum2 = 0;

    continue;

    }

    else

    break;

    }

    else if (end + 1 < n)

    sum2 = sum1 + 1 + len[end + 1];

    else

    {

    ans.push_back(fun68(words, len, start, end, L));

    break;

    }

    if (sum1 < L && sum2 > L) // 说明到end应结束一行

    {

    ans.push_back(fun68(words, len, start, end, L));

    start = end + 1;

    end = start;

    sum1 = len[end];

    sum2 = 0;

    continue;

    }

    sum1 += 1 + len[end + 1];

    end++;

    }

    return ans;

    }

    };

最新文章