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函数+水题)

[Mdfs] lc剑指 Offer 38. 字符串的排列(全排列+枚举顺序+组合类型枚举+知识理解+模板题)

[M排序] lc274. H 指数(排序+模拟)

模拟测试20191013