暴力枚举可划分的次数,用cap来维护当前的已划分了多少个字符,当cap大于等于字符串长度时即为找到了可划分的次数,进行模拟;如若划分的次数最坏情况为尾部的<a/b>长度大于等于limit了,则说明无解。
要注意的是分类讨论,当划分次数上升一个数量级,要从cap中减去相应的数。
class Solution {
public:
vector<string> splitMessage(string message, int limit) {
int n=message.size();
int i=1,cap=0,tail;
for(;;i++){
if(i<10){
tail=5;
}else if(i<100){
if(i==10) cap-=9;
tail=7;
}else if(i<1000){
if(i==100) cap-=99;
tail=9;
}else if(i<10000){
if(i==1000) cap-=999;
tail=11;
}
if(tail>=limit) return{};
cap+=limit-tail;
if(cap>=n) break;
}
vector<string> ans;
for(int j=0,k=0;j<i;j++){
string t="<"+to_string(j+1)+"/"+to_string(i)+">";
if(j==i-1) ans.push_back(message.substr(k)+t);
else{
int len=limit-t.size();
ans.push_back(message.substr(k,len)+t);
k+=len;
}
}
return ans;
}
};
时间复杂度:O(nlogn)
空间复杂度:O(1)
该博客主要探讨了一种字符串划分问题,通过暴力枚举方法找出在限制每个子串长度不超过特定值的情况下,将字符串划分的可行次数。算法复杂度分析包括时间复杂度O(nlogn)和空间复杂度O(1)。内容涉及字符串处理、算法设计和优化。
510

被折叠的 条评论
为什么被折叠?



