IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode-【模拟】文本左右对齐 -> 正文阅读

[数据结构与算法]LeetCode-【模拟】文本左右对齐

题目描述

题目

测试用例

测试用例

题目分析

  1. 最后一行与前几行不一样:前几行空格均匀分配;最后一行空格一个单词最多后面紧接着一个空格
  2. 可遍历一遍整个words,记录子串的左右边界单词,遍历到当前单词时分三种情况:加入当前单词后,子串尚未充满;子串刚好充满;子串过长
  3. 如果子串尚未充满,则更新右边界
  4. 如果子串刚好充满,构建当前完整子串
  5. 如果子串过长,构建当前完整子串,并把当前单词加入下一个子串
  6. “构建子串”这个子函数,只需要把空格均分,从左往右多余的每两个单词之间最多加一个,额外空格用完为止
  7. “构建最后子串”这个子函数,左对齐安排单词和最多一个空格,用完单词后,长度不够,空格来凑!

python实现

class Solution(object):
    def fullJustify(self, words, maxWidth):
        """
        :type words: List[str]
        :type maxWidth: int
        :rtype: List[str]
        """
        left,right = 0,0    #当前子串左右边界单词
        len_of_list = 0     #当前子串已用长度(含空格)
        ans = []
        for index in range(len(words)):
            if len_of_list == 0:
                left,right = index,index
            if len_of_list + len(words[index]) < maxWidth:
                #当前子串还有剩余长度
                len_of_list += len(words[index]) + 1
                right = index   #及时更新右边界
            elif len_of_list + len(words[index]) == maxWidth:
                #刚好无额外空格
                len_of_list += len(words[index])
                right = index
                #构建子串
                substr = self.construct_substr(words, left, right, maxWidth)
                len_of_list = 0
                #放入最终结果
                ans.append(substr)

            else:   #过长则处理之前字串,并存下当前单词
                #构建子串
                substr = self.construct_substr(words, left, right, maxWidth)
                len_of_list = 0
                #放入最终结果
                ans.append(substr)

                left,right = index,index
                len_of_list += min(len(words[index]) + 1, maxWidth) #防止当前单词长度等于 maxWidth


        
        if len_of_list != 0:
            #如果仍剩余单词
            laststr = self.construct_laststr(words, left, right, maxWidth)
            ans.append(laststr)
        

        return ans

    
    def construct_substr(self, words, left, right, maxWidth):
        #构建子串
        '''
        rtype:str
        包含:words[left]~words[right]以及若干均匀分布空格
        '''
        substr = ''
        num_of_words = right - left + 1     #单词数量
        if num_of_words == 1:
            substr += words[left]
            while len(substr)<maxWidth:
                substr += ' '
            return substr

        len_of_words = 0        #纯单词长度
        for i in range(left, right+1):
            len_of_words += len(words[i])
        average_space = (maxWidth - len_of_words)/(num_of_words-1)     #平均分配的空格数
        extra_space = (maxWidth - len_of_words) % (num_of_words-1)     #额外空格数
                                                                       #每两个单词间分配一个
        for i in range(left, right+1):
            word = words[i]
            substr += word
            if i != right:
                substr += ' '*average_space
                if extra_space != 0:
                    substr += ' '
                    extra_space -= 1
        
        #断言
        assert len(substr)==maxWidth, '构建字串长度不正确'
        return substr

    def construct_laststr(self, words, left, right, maxWidth):
        #处理最后一个字串
        '''
        rtype:str
        包含:words[left]~words[right]以及若干单空格
        '''
        laststr = ''
        for i in range(left, right+1):
            word = words[i]
            laststr += word
            if i != right:
                laststr += ' '
        
        while len(laststr) < maxWidth:
            #长度不够,空格来凑
            laststr += ' '
        
        return laststr

代码性能

代码性能

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-28 12:36:29  更:2021-10-28 12:38:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:45:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码