Leetcode2468-根据限制分割消息

该博客主要探讨了一种字符串划分问题,通过暴力枚举方法找出在限制每个子串长度不超过特定值的情况下,将字符串划分的可行次数。算法复杂度分析包括时间复杂度O(nlogn)和空间复杂度O(1)。内容涉及字符串处理、算法设计和优化。

        暴力枚举可划分的次数,用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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值