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

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

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

class Solution {
public:
// 给定相应的参数,返回该行字符串满足右对齐
string fun68(vector<string> &words, int len[], int start, int end, int L)
{
if(start == end)
{
string subans = words[start];
for (int i = ; i < L - len[start]; ++i)
subans += ' ';
return subans;
}
string ans = "";
int tolen = , inter = ; // 词的长度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() -) // 如果是最后一个了,那么每个单词空一格单词,剩下的空格放在最后边
{
for (int i = start; i < words.size() - ; i++)
{
ans += words[i] + ' ';
}
ans += words[end];
left -= (end - start);
for (int i = ; i < left; i++)
ans += ' ';
}
else // 否则就是平均分空格
{
for (int i = start; i <start + times; ++i)
{
ans += words[i];
for (int j = ; j < inter + ; ++j)
{
ans += " ";
}
}
for (int i = start + times; i < end; ++i) // 多出来的不能平均分的空格从左边开始分
{
ans += words[i];
for (int j = ; j < inter; ++j)
{
ans += " ";
}
}
ans += words[end];
}
return ans;
}
//主函数
vector<string> fullJustify(vector<string> &words, int L)
{
vector<string> ans;
if (words.size() == )
{
return ans;
}
int n = words.size();
int *len = new int[n];
for (int i = ; i < n; ++i)
{
len[i] = words[i].size();
}
int sum1 = len[], sum2 = , start = , end = ; // sum1记录从start开始的词到end的包括空格的长度
string tmp = "";
while ()
{
if (sum1 == L || sum1 + == L) // 如果有满足刚好等于L,那么就是要输出一行了
{
ans.push_back(fun68(words, len, start, end, L));
start = end + ;
end = end + ;
if(end < n)// 没输出一行要相应的该sum的值,相当于重新计算过
{
sum1 = len[end];
sum2 = ;
continue;
}
else
break;
}
else if (end + < n)
sum2 = sum1 + + len[end + ];
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 + ;
end = start;
sum1 = len[end];
sum2 = ;
continue;
}
sum1 += + len[end + ];
end++;
}
return ans;
}
};

原创,但不是最好的。有时间了再学习学习50行的。

Text Justification 实现两端对齐功能的更多相关文章

  1. [LeetCode] Text Justification 文本左右对齐

    Given an array of words and a length L, format the text such that each line has exactly L characters ...

  2. Text Justification 文本左右对齐

    Given an array of words and a length L, format the text such that each line has exactly L characters ...

  3. 实现css两端对齐

    如何实现css的两端对齐功能? 最近做项目遇到这种情况,如图所示: input左边框的用户,旧密码,新密码,确认密码无法对齐,样式很丑. 解决办法: 找到对应的类名,加上:text-align:jus ...

  4. 68. Text Justification一行单词 两端对齐

    [抄题]: Given an array of words and a width maxWidth, format the text such that each line has exactly  ...

  5. [MIT6.006] 20. Daynamic Programming II: Text Justification, Blackjack 动态规划II:文本对齐,黑杰克

    这节课通过讲解动态规划在文本对齐(Text Justification)和黑杰克(Blackjack)上的求解过程,来帮助我们理解动态规划的通用求解的五个步骤: 动态规划求解的五个"简单&q ...

  6. [Swift]LeetCode68. 文本左右对齐 | Text Justification

    Given an array of words and a width maxWidth, format the text such that each line has exactly maxWid ...

  7. Text Justification,文本对齐

    问题描述:把一个集合的单词按照每行L个字符放,每行要两端对齐,如果空格不能均匀分布在所有间隔中,那么左边的空格要多于右边的空格,最后一行靠左对齐. words: ["This", ...

  8. [Leetcode] text justification 文本对齐

    Given an array of words and a length L, format the text such that each line has exactly L characters ...

  9. [LeetCode] 68. Text Justification 文本对齐

    Given an array of words and a length L, format the text such that each line has exactly L characters ...

随机推荐

  1. Git现实(一个)版本控制概述

    从今天开始.我们了解的分布式版本控制系统Git相关内容.了解Git之前,我们的第一个版本控制系统,使宏观的描述. 什么是版本号控制 版本号控制是指通过对文件内容的变化进行记录,并为每次的变化进行编号, ...

  2. windows下一个,OracleServiceXXX和Oracle 关系实例

    其实,windows下的oracle,在oracle实例启动时,是全然依赖于 window服务中的OracleServiceXXX .这个XXX就是oracle的实例名(注意啊,不是数据库名称,而是实 ...

  3. Could not roll back JDBC transaction途径

    [异常]接口数量:DM02;错误代码:ERR_EAI_02_014; 错误叙述性说明:当将中间库异常Could not roll back JDBC transaction; nested excep ...

  4. 炫酷的CSS3发光搜索表单,附演示和源码

    原文:炫酷的CSS3发光搜索表单,附演示和源码 昨天在国外的论坛上逛的时候,看到一篇帖子是求助如何利用CSS3实现发光效果的,网友回复中有一个推荐了一款CSS3发光搜索表单,利用CSS3的动画属性,设 ...

  5. Base64中文不能加密问题

    最近用到了Base64.js来对url参数进行加密,字母和数字都可以很好地加密/解密. 但测试中文时发现不能进行转换,貌似Base64.js不支持中文字符. 联想到encodeURI()对url的编码 ...

  6. 2款不同样式的CSS3 Loading加载动画 附源码

    原文:2款不同样式的CSS3 Loading加载动画 附源码 我们经常看到的Loading加载很多都是转圈圈的那种,今天我们来换一种有创意的CSS3 Loading加载动画,一种是声波形状的动画,另一 ...

  7. MVC中使用泛型仓储模式和依赖注入

    在ASP.NET MVC中使用泛型仓储模式和依赖注入,实现增删查改 原文链接:http://www.codeproject.com/Articles/838097/CRUD-Operations-Us ...

  8. 4、Cocos2dx 3.0三,找一个小游戏开发Hello World 分析

    尊重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27186557 Hello World 分析 打开新 ...

  9. 十天学Linux内核之第二天---进程

    原文:十天学Linux内核之第二天---进程 都说这个主题不错,连我自己都觉得有点过大了,不过我想我还是得坚持下去,努力在有限的时间里学习到Linux内核的奥秘,也希望大家多指点,让我更有进步.今天讲 ...

  10. Winform 实现像菜单一样弹出层

    原文:Winform 实现像菜单一样弹出层 在实际工作中,如果能像菜单一样弹出自定义内容,会方便很多,比如查询时,比如下拉列表显示多列信息时,比如在填写某个信息需要查看一些信息树时.这个时候自定义弹出 ...