《leetCode-php》文本换行

本文介绍了一种将单词数组在给定长度内两端对齐的算法,确保每行恰好有L个字符,通过均匀分布额外空格实现。最后一行左对齐,不插入额外空格。算法考虑了单词长度不超过L的约束。

给定一个单词数组和长度L,将该单词数组中文本两端对齐(左边和右边),使每一行都有L个字符。
你要在每一行中尽可能多地填充单词。在必要时填充额外的空格' ',使每行正好有L个字符。
单词之间的额外空格要尽可能均匀地分布。如果一行的空格数不能在单词之间平均分配,请在左边分配更多的空格
对于最后一行文本,它应该左对齐,并且单词之间不插入额外的空格。 

例如, 

单词数组为:["This", "is", "an", "example", "of", "text", "justification."]

L:16.

返回 

[↵   "This    is    an",↵   "example  of text",↵   "justification.  "↵]

注意: 

题目保证每个单词的长度不超过L。
特殊样例:

  • 有一些行(不是最后一行)可能只包含一个单词。在这种情况下该怎么办? 在这种测试数据中,这一行应该左对齐。
  • 注意:同一行的两个单词之间要有一行空格
    <?php
    function fullJustify($arrWords, $l) {
        $num = count($arrWords);
        $need = $l;
        $start = 0;
        $end = -1;
        $arrRet = array();
        for ($i = 0; $i < $num; $i ++) {
            $sLen = strlen($arrWords[$i]);
            //如果这个放不下,就代表这一行结束了。
            if ($sLen > $need) {
                $gapNum = $i - 1 - $start;
                $flag = ($need + $gapNum + 1) % $gapNum;//需要填补的空格是否能被整除
                $spaceNum = floor(($need + $gapNum + 1) / $gapNum);
                $str = '';
                for ($j = $start; $j < $i - 1; $j ++) {
                    $str .= $arrWords[$j];
                    for ($k = 0; $k < $spaceNum; $k ++) {
                        $str .= ' ';
                    }
                    //不能被整除需要左边多加空格
                    if ($flag != 0) {
                        $str .= ' ';
                        $flag --;
                    }
                }
                //一行的最后一个字符不需要空格
                $arrRet[] = $str . $arrWords[$j];;
                $start = $i;
                $end = $i - 1;
                $need = $l - $sLen -1;
            } else {
                if ($need == $sLen) {
                    $str = '';
                    for ($j = $start; $j < $i; $j ++) {
                        $str .= $arrWords[$j] . ' ';
                    }
                    //一行的最后一个字符不需要空格
                    $arrRet[] = $str . $arrWords[$j];
                    $need = $l;
                    $start = $i + 1;
                    $end = $i;
                } else {
                    $need = $need - $sLen - 1;
                }
            }
        }
        //最后一列
        if ($end != $num - 1) {
            $str = '';
            for ($i = $start; $i < $num - 1; $i ++) {
                $str .= $arrWords[$i] . ' ';
            }
            //最后一行的最后一个单词
            $str .= $arrWords[$i];
            $strLen = strlen($str);
            for ($i = 0; $i < $l - $strLen; $i ++) {
                $str .= ' ';
            }
            $arrRet[] = $str;
        }
        print json_encode($arrRet);
    }
    //'this','is','an','example','of','text',
    $arr = ['justification.'];
    fullJustify($arr, 16);

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值