LC2468.根据限制分割消息(枚举&模拟)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LC2468.根据限制分割消息(枚举&模拟)相关的知识,希望对你有一定的参考价值。
LC2468.根据限制分割消息(枚举&模拟)
枚举分割次数,关键如何快速计算可以提供的字符串长度。
显然是跟当前的位数有关,1-9 是一类、10-99 是一类。因此可以 O ( l o g n ) O(logn) O(logn)快速计算出来。
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
class Solution
public:
vector<string> splitMessage(string message, int limit)
int n = message.size();
// 计算每个数字十进制表示的长度
int f[n + 1];
for (int i = 1; i <= n; i++)
f[i] = 0;
for (int x = i; x; x /= 10) f[i]++;
// 生成原字符串从下标 from 开始,长度为 len 的子字符串。后面再加上 <which/all>。
auto gao = [&](int from, int len, int which, int all)
return message.substr(from, len) + "<" + to_string(which) + "/" + to_string(all) + ">";
;
// 枚举分成几份
for (int X = 1; X <= n; X++)
// 当前应该包含原字符串中的多少字符
int tot = 0;
// 枚举 i = 1, 10, 100, 1000...,每次枚举一个长度的数字
// 同时为了方便,枚举 j = 10, 100, 1000, 10000...,表示长度一样的数字的上界
for (int i = 1, j = 10; i < X; i *= 10, j *= 10)
// 套公式
int each = limit - 3 - f[X] - f[i];
// 长度相同的数字一共 min(j, X) - i 个
tot += each * (min(j, X) - i);
// 检查最后一份的长度
if (n - tot > 0 && n - tot <= limit - 3 - f[X] * 2)
// 检查通过,开始按题意模拟字符串的分割
vector<string> ans;
tot = 0;
// 计算第 i 份的内容
for (int i = 1; i < X; i++)
// 套公式
int each = limit - 3 - f[X] - f[i];
ans.push_back(gao(tot, each, i, X));
tot += each;
// 计算最后一份的内容
ans.push_back(gao(tot, n - tot, X, X));
return ans;
return ;
;
以上是关于LC2468.根据限制分割消息(枚举&模拟)的主要内容,如果未能解决你的问题,请参考以下文章
[M模拟] lc401. 二进制手表(模拟+位运算技巧+sprintf()技巧+二进制枚举)
[M模拟] lc165. 比较版本号(字符串分割+split函数+水题)
[M模拟] lc165. 比较版本号(字符串分割+split函数+水题)