当前位置: 首页 > news >正文

C#,文字排版的折行问题(Word-wrap problem)的算法与源代码

1、英文的折行问题


给定一个单词序列,以及一行中可以输入的字符数限制(线宽)。
在给定的顺序中放置换行符,以便打印整齐。
假设每个单词的长度小于线宽。
像MS word这样的文字处理程序负责放置换行符。
这个想法是要有平衡的线条。
换句话说,不是只有几行有很多额外空间,有些行有少量额外空间。

2、中文的处理

文字断行完成后,需要进行行内排版。
文档行中各个字符的宽度之和不大可能正好等于文档容器的客户区宽度。两者会有空白差。
由于中文字符和英文字符宽度不一样,对于不等宽字体,各个英文字符、数字字符等宽度还不一样。使得各个文本行的字符宽度之和是不一样的,使得各个文档行右边缘是参差不齐的。这样比较严重的影响美观。
为此需要将文档行的宽度拉长成文档容器客户区宽度,由此会额外的制造出不少空白,此时需要将这些空白比较均匀的分摊到各个字符上。此处是比较均匀的分摊,但不是完全均匀,是有一定的分布算法的。
同一行中,字符不是相对孤立的,而且从逻辑上分为一组一组的,对于汉字和标点符号,它们是各自为政,自己组成一组。对于连续的英文字母字符和阿拉伯数字,它们逻辑上是同一组的,一起构成一个完整的单词,因此同一组之间的字符之间应该是紧密连接在一起,不得拆开。[袁永福版权所有]
为此要分摊由于文字两边对齐而造成的额外空间时,首先要对文档行的字符进行分组,然后将额外的空白平均分摊到字符组上。
 

3 源程序

using System;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{public static partial class Algorithm_Gallery{public static int WordWrap_Solve(int[] nums, int k){int[,] memo = new int[nums.Length, k + 1];for (int i = 0; i < memo.GetLength(0); i++){for (int j = 0; j < memo.GetLength(1); j++){memo[i, j] = -1;}}return WordWrap_Solve_UsingMemo(nums, nums.Length, k, 0, k, memo);}private static int WordWrap_Solve_Utility(int[] words, int n, int length, int wordIndex, int remLength, int[,] memo){if (wordIndex == n - 1){memo[wordIndex, remLength] = words[wordIndex] < remLength ? 0 : Square(remLength);return memo[wordIndex, remLength];}int currWord = words[wordIndex];if (currWord < remLength){int sa = WordWrap_Solve_UsingMemo(words, n, length, wordIndex + 1, (remLength == length) ? (remLength - currWord) : (remLength - currWord - 1), memo);int sb = Square(remLength) + WordWrap_Solve_UsingMemo(words, n, length, wordIndex + 1, length - currWord, memo);return Math.Min(sa, sb);}else{return Square(remLength) + WordWrap_Solve_UsingMemo(words, n, length, wordIndex + 1, length - currWord, memo);}}private static int WordWrap_Solve_UsingMemo(int[] words, int n, int length, int wordIndex, int remLength, int[,] memo){if (memo[wordIndex, remLength] != -1){return memo[wordIndex, remLength];}memo[wordIndex, remLength] = WordWrap_Solve_Utility(words, n, length, wordIndex, remLength, memo);return memo[wordIndex, remLength];}private static int Square(int n){return n * n;}private static List<string> solution = new List<string>();public static int WWP_Solution(int[] p, int n){int k;if (p[n] == 1){k = 1;}else{k = WWP_Solution(p, p[n] - 1) + 1;}solution.Add("Line number " + k + ": From word no. " + p[n] + " to " + n);return k;}public static void WordWrap_Solve(int[] sentence, int n, int M){int[,] extras = new int[n + 1, n + 1];int[,] lc = new int[n + 1, n + 1];int[] c = new int[n + 1];int[] p = new int[n + 1];for (int i = 1; i <= n; i++){extras[i, i] = M - sentence[i - 1];for (int j = i + 1; j <= n; j++){extras[i, j] = extras[i, j - 1] - sentence[j - 1] - 1;}}for (int i = 1; i <= n; i++){for (int j = i; j <= n; j++){if (extras[i, j] < 0){lc[i, j] = int.MaxValue;}else if (j == n && extras[i, j] >= 0){lc[i, j] = 0;}else{lc[i, j] = extras[i, j] * extras[i, j];}}}c[0] = 0;for (int j = 1; j <= n; j++){c[j] = int.MaxValue;for (int i = 1; i <= j; i++){if (c[i - 1] != int.MaxValue && lc[i, j] != int.MaxValue && (c[i - 1] + lc[i, j] < c[j])){c[j] = c[i - 1] + lc[i, j];p[j] = i;}}}solution.Clear();WWP_Solution(p, n);}}
}

相关文章:

C#,文字排版的折行问题(Word-wrap problem)的算法与源代码

1、英文的折行问题 给定一个单词序列&#xff0c;以及一行中可以输入的字符数限制&#xff08;线宽&#xff09;。 在给定的顺序中放置换行符&#xff0c;以便打印整齐。 假设每个单词的长度小于线宽。 像MS word这样的文字处理程序负责放置换行符。 这个想法是要有平衡的线条。…...

VUE+VScode+elementUI开发环境

0.vue官方文档 你正在阅读的是 Vue 3 的文档&#xff01; 1.前端准备阶段 VUEVScodeelementUI开发环境 2.Vue外部组件 element-ui 3.angular外部组件 angular-ui 4.教学视频 尚学堂b站视频 5.教学视频配套文档 D:\BaiduNetdiskDownload\025【尚学堂】全新2022版WEB前端为初学者…...

第十四届蓝桥杯省赛真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A \mathrm{A} A : 特殊日期试题 B: 与或异或试题 C : \mathrm{C}: C: 平均试题 D: 棋盘试题 E : \mathrm{E}: E: 互质数的个数试题 F: 阶乘的和试题 G: 小蓝的旅行计划试题 H: 太阳试题 I: 高塔试题 J \mathrm{J} J : 反异或 01 串 发现…...

可视化展示与交互编辑:探索3D Web轻量化平台HOOPS WEB Platform在BIM中的新可能性

随着数字技术的飞速发展&#xff0c;建筑行业也在不断迈向数字化转型的道路。在这个过程中&#xff0c;BIM&#xff08;Building Information Modeling&#xff0c;建筑信息模型&#xff09;技术已经成为建筑设计、施工和管理领域中的一项重要工具。 而在BIM的应用中&#xff…...

Linux(centos)环境下安装Nginx的步骤文档

在Linux环境下安装Nginx是一个相对直接的过程&#xff0c;本篇文章将提供一个较为通用的安装指南&#xff0c;以及一些可能遇到的问题和解决方案。 目录 一、简介 二、先决条件 三、安装Nginx 1、使用包管理器安装 2、从源代码安装 四、验证安装 五、基本配置 六、常见…...

AI毕业论文降重GPTS,避免AI检测,高效完成论文

视频演示 AI毕业论文降重GPTS&#xff0c;避免AI检测&#xff0c;高效完成论文&#xff01; 开发目的 “毕业论文降重”GPTS应用&#xff0c;作用为&#xff1a;重新表述学术论文&#xff0c;降低相似性评分&#xff0c;避免AI检测。 使用地址 地址&#xff1a;毕业论文降重…...

什么是线程死锁?形成死锁的四个必要条件是什么?如何避免线程死锁?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 什么是线程死锁 线程死锁是指两个或多个线程由于互相持有对方所需要的资源而无法继续执行的情况。当多个线程同时占用资源,并等待其他线程释放它们所需要…...

webpack一些常用的Loader和Plugin

文章目录 webpack4一些常用的Loader&#xff1a;webpack4一些常用的Plugin&#xff1a;关于webpack5的一些特点&#xff1a;新增特性&#xff1a;修复的问题&#xff1a;内置模块和工具&#xff1a; 关于webpack5的一些内置:内置Loader&#xff1a;内置Plugin&#xff1a; webp…...

SpringCloud Bus 消息总线

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第八篇&#xff0c;即介绍 Bus 消息总线。 二、概述 2.1 遗留的问题 在上一篇文章的最后&#xff0c;我…...

汽车屏类产品(五):仪表Cluster常用芯片i.MX117x

前言: 仪表一般就是指方向盘前面那个表盘。做仪表的芯片最主要需要支持显示Display,而仪表的主要排版布局多种多样,但是主旨显示内容不尽相同。 仪表需求: 1、rpm转速表盘 仪表Cluster一般会有转速表盘rpm,单位一般是x1000,大部分汽车仪表范围就是0~8,也就是最高8000…...

SQLiteC/C++接口详细介绍之sqlite3类(三)

快速跳转文章列表&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;二&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;四&#xff09; 6.sqlite3_create_module与sqlite3_create_module_v2函数…...

Xcode调试Qt 源码

在Mac下使用Xcode 开发Qt程序&#xff0c;由于程序断点或者崩溃后&#xff0c;Qt库的堆栈并不能够正确定位到源码的cpp文件&#xff0c;而是显示的是汇编代码&#xff0c;导致不直观的显示。 加载的其他三方库都是同理。 所以找了攻略和研究后&#xff0c;写的这篇文章。 一&a…...

CVE-2019-5782:kArgumentsLengthType 设置偏小导致优化阶段可以错误的去除 CheckBound 节点

文章目录 环境搭建漏洞分析笔者初分析笔者再分析漏洞触发源码分析 漏洞利用总结 环境搭建 sudo apt install pythongit reset --hard b474b3102bd4a95eafcdb68e0e44656046132bc9 export DEPOT_TOOLS_UPDATE0 gclient sync -D// debug version tools/dev/v8gen.py x64.debug ni…...

uni-app微信小程序上拉加载,下拉刷新

pages.json配置官网链接 onPullDownRefresh、onReachBottom函数跟生命周期同级 data() {return {orderList:[],total: null, //总共多少条数据page: 1,pageSize: 10,} }, onLoad() {}, mounted(){this.getInfo() }, methods:{getInfo(){API.getListxxx().then(res > {const…...

HTML案例-2.标签综合练习

目录 效果 知识点 1.图像标签 2.链接标签 3.锚点定位 4.base标签 源码 页面1 页面2 效果 知识点 1.图像标签 <img src="图像URL" /> 单标签 属性 属性值 描述 src URL 图像的路径 alt 文本...

C++中的多值返回:解锁函数返回值的神奇力量

C中的多值返回&#xff1a;解锁函数返回值的神奇力量 在C编程中&#xff0c;有时候我们需要从函数中返回多个值。虽然C中的函数通常只能返回一个值&#xff0c;但有几种技术和惯用法可以实现返回多个值的效果。本文将介绍C中实现多值返回的几种常用方法&#xff0c;包括引用、指…...

D咖智能咖啡机:营业利器,品质与效率的完美结合

D咖作为中国知名国产商用全自动咖啡机品牌&#xff0c;持续引领商用全自动智能咖啡机赛道技术、产品、创新的行业新标准&#xff0c;目前为全国几十个地区提供全场景自助咖啡机解决方案&#xff0c;并获得了广泛的认可和口碑。 一、便捷操作&#xff1a;一键即可享受美味咖啡 在…...

江科大stm32学习笔记【6-2】——定时器定时中断定时器外部时钟

一.定时器定时中断 1.原理 2.硬件 3.程序 此时CK_PSC72M&#xff0c;定时1s&#xff0c;也就是定时频率为1Hz&#xff0c;所以可以PSC7200-1,ARR10000-1。 Timer.c: #include "stm32f10x.h" // Device headerextern uint16_t Num;//声明跨文件的…...

go优雅重试

实现思路&#xff1a; 重试配置定义最大重试次数和固定重试间隔&#xff1b;使用接口优雅传递可选重试配置参数&#xff1b;重试的模板方法必须返回错误&#xff0c;且只有一个返回值&#xff1b;如果需要使用被重试方法的返回值&#xff0c;使用匿名方法包一层真实方法并在匿…...

Python最常用的库

本文章主要为大家总结&#xff0c;9个Python最常用的包及使用案例 1 NumPy 描述: NumPy 是 Python 的一个扩展库&#xff0c;支持高维数组与矩阵运算&#xff0c;并为数组运算提供了大量的数学函数库。它是科学计算中的基础包之一&#xff0c;用于处理大型多维数组和矩阵的运…...

OpenClaw简历优化助手:Qwen2.5-VL-7B分析岗位JD生成匹配度报告

OpenClaw简历优化助手&#xff1a;Qwen2.5-VL-7B分析岗位JD生成匹配度报告 1. 为什么需要简历优化助手 去年换工作时&#xff0c;我花了整整两周时间反复修改简历。每次看到"岗位职责"里那些模糊的要求&#xff0c;总担心自己的简历不够匹配。最痛苦的是&#xff0…...

如何快速提升Python开发效率:VS Code扩展终极指南

如何快速提升Python开发效率&#xff1a;VS Code扩展终极指南 【免费下载链接】pylance-release Documentation and issues for Pylance 项目地址: https://gitcode.com/gh_mirrors/py/pylance-release Python开发工具在当今编程世界中扮演着至关重要的角色&#xff0c;…...

semi-utils:让照片水印处理效率提升15倍的智能批处理方案

semi-utils&#xff1a;让照片水印处理效率提升15倍的智能批处理方案 【免费下载链接】semi-utils 一个批量添加相机机型和拍摄参数的工具&#xff0c;后续「可能」添加其他功能。 项目地址: https://gitcode.com/gh_mirrors/se/semi-utils 在数字影像创作领域&#xff…...

美胸-年美-造相Z-Turbo部署避坑指南:Xinference日志解读与常见启动失败排查

美胸-年美-造相Z-Turbo部署避坑指南&#xff1a;Xinference日志解读与常见启动失败排查 1. 项目简介与部署价值 美胸-年美-造相Z-Turbo是基于Z-Image-Turbo LoRA版本的专业文生图模型&#xff0c;专注于高质量的美胸年美风格图像生成。通过Xinference框架部署&#xff0c;结合…...

SMUDebugTool终极指南:如何深度调试AMD Ryzen处理器底层硬件

SMUDebugTool终极指南&#xff1a;如何深度调试AMD Ryzen处理器底层硬件 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: http…...

轻量级华硕笔记本控制神器G-Helper:彻底告别Armoury Crate的臃肿体验

轻量级华硕笔记本控制神器G-Helper&#xff1a;彻底告别Armoury Crate的臃肿体验 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, …...

【UE6.5 C++27 适配权威指南】:20年引擎老兵亲授7步零错误迁移法(含编译器链兼容性验证清单)

第一章&#xff1a;UE6.5 C27 适配的战略认知与前置准备Unreal Engine 6.5 对 C27 标准的初步支持标志着引擎底层工具链的重大演进。这一适配并非简单的编译器升级&#xff0c;而是涉及构建系统、反射机制、蓝图互操作性及内存模型兼容性的系统性重构。开发者需摒弃“仅更新编译…...

YOLO26改进 - 注意力机制 | PPA(Parallelized Patch-Aware Attention)并行补丁感知注意:分层特征融合保持小目标表征

前言 本文介绍了用于红外小目标检测的深度学习方法HCF-Net及其在YOLO26中的结合应用。HCF-Net采用升级版U-Net架构,包含PPA、DASI和MDCR三个关键模块。PPA模块利用分层特征融合和注意力机制,采用多分支特征提取策略,捕获不同尺度和级别的特征信息;DASI模块增强跳跃连接,实…...

Nginx从专家到小白

文章目录主要用途Nginx 本地路径映射 HTTP 服务搭建文档一、环境信息二、安装步骤2.1 下载 Nginx2.2 解压安装三、配置说明3.1 配置文件路径3.2 完整配置内容3.3 配置项说明四、常用命令4.1 启动 Nginx4.2 停止 Nginx4.3 重新加载配置4.4 查看进程状态4.5 查看端口监听4.6 测试…...

【2026年恒生电子春招- 4月2日-第一题- 等差数列模最大值】(题目+思路+JavaC++Python解析+在线测试)

题目内容 某智能手环公司需统计用户在 $ 2024 $ 年 $ 5 $ 月的健康数据,分析用户的步数达标情况。由于部分设备存在数据上报故障,需在分析中排除故障期间的数据。具体表如下: 用户表( $ users $ )存储用户基本信息 $ user_id $ : $ INT $ 类型,主键,用户唯一标识。 $…...