赞
踩
class Solution:
def splitMessage(self, message: str, limit: int) -> List[str]:
# 枚举模拟递推题
# limit:每个分块长度小于等于limit
# i:分割的个数, cap:当前message的已存个数
# i < 10 ** 4, 每个长度至少为1,否则再多也完成不了了
n = len(message)
i = cap = 0
while True:
i += 1
if i < 10:
tail_len = 5
elif i < 100:
# 第一次跃升减9个cap
if i == 10: cap -= 9
tail_len = 7
elif i < 1000:
if i == 100: cap -= 99
tail_len = 9
else:
if i == 1000: cap -= 999
tail_len = 11
if tail_len >= limit: return [] # gg
cap += limit - tail_len
if cap < len(message): continue
# cap第一次超过其长度,获取答案
ans, cur = [], 0
for j in range(1, i + 1):
tail = f'<{j}/{i}>'
if j == i: # 末尾
ans.append(message[cur:] + tail)
else:
available = limit - len(tail)
ans.append(message[cur: cur + available] + tail)
cur += available
return ans
class Solution {
public String[] splitMessage(String message, int limit) {
int n = message.length();
for (int i = 1, cap = 0, tail_len; ; ++i) {
if (i < 10) tail_len = 5;
else if (i < 100) {
if (i == 10) cap -= 9;
tail_len = 7;
} else if (i < 1000) {
if (i == 100) cap -= 99;
tail_len = 9;
} else {
if (i == 1000) cap -= 999;
tail_len = 11;
}
if (tail_len >= limit) return new String[]{}; // gg
cap += limit - tail_len;
if (cap < n) continue;
// ouput the result
var ans = new String[i];
for (int j = 0, cur = 0; j < i; ++j) {
var tail = "<" + (j + 1) + "/" + i + ">";
if (j == i - 1) ans[j] = message.substring(cur) + tail;
else {
int available = limit - tail.length();
ans[j] = message.substring(cur, cur + available) + tail;
cur += available;
}
}
return ans;
}
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。