Leetcode.2522 将字符串分割成值不超过 K 的子字符串

2023-09-22 10:32:05

题目链接

Leetcode.2522 将字符串分割成值不超过 K 的子字符串 rating : 1605

题目描述

给你一个字符串 s s s ,它每一位都是 1 1 1 9 9 9 之间的数字组成,同时给你一个整数 k k k

如果一个字符串 s s s 的分割满足以下条件,我们称它是一个 分割:

  • s s s 中每个数位 恰好 属于一个子字符串。
  • 每个子字符串的值都小于等于 k k k

请你返回 s s s 所有的 分割中,子字符串的 最少 数目。如果不存在 s s s 分割,返回 − 1 -1 1

注意:

  • 一个字符串的 是这个字符串对应的整数。比方说,"123" 的值为 $1234 ,"1" 的值是 1 1 1
  • 子字符串 是字符串中一段连续的字符序列。
示例 1:

输入:s = “165462”, k = 60
输出:4
解释:我们将字符串分割成子字符串 “16” ,“54” ,“6” 和 “2” 。每个子字符串的值都小于等于 k = 60 。
不存在小于 4 个子字符串的好分割。

示例 2:

输入:s = “238182”, k = 5
输出:-1
解释:这个字符串不存在好分割。

提示:
  • 1 ≤ s . l e n g t h ≤ 1 0 5 1 \leq s.length \leq 10^5 1s.length105
  • s [ i ] s[i] s[i]'1''9' 之间的数字。
  • 1 ≤ k ≤ 1 0 9 1 \leq k \leq 10^9 1k109

解法一 : 动态规划

我们定义 f ( i ) f(i) f(i) s s s 的前 i i i 个字符中,好分割的最少个数。按照定义,最终我们返回的答案就是 f ( n ) f(n) f(n)

那么我们很容易就能得出状态转移方程:

f [ j ] = m a x ( f [ j ] , f [ i ] + 1 ) ( s [ i + 1 , j ] ≤ k , i < j ) f[j] = max(f[j] , f[i] + 1) \qquad (s[i + 1,j] \leq k , i < j) f[j]=max(f[j],f[i]+1)(s[i+1,j]k,i<j)

由于 k ≤ 1 0 9 k \leq 10^9 k109,所以 j − i j - i ji 最大就是 9 9 9

时间复杂度: O ( n × 9 ) O(n \times 9) O(n×9)

C++代码:

class Solution {
public:
    int minimumPartition(string s, int k) {
        int n = s.size();
        vector<int> f(n + 1,1e9);
        f[0] = 0;

        for(int i = 0;i <= n;i++){
            int len = min(n , i + 9) , sum = 0;

            for(int j = i + 1;j <= len;j++){
                sum = sum * 10 + (s[j - 1] - '0');
                if(sum > k) break;
                f[j] = min(f[i] + 1 , f[j]);
            }
        }

        //for(int i = 1;i <= n;i++) cout<<f[i]<<" ";

        return f[n] == 1e9 ? -1 : f[n];
    }
};

解法二:贪心

我们每次分割的时候,让 好分割 尽可能的大,剩下的子串就更少,所能得到的 好分割 也就越少。

所以贪心策略就是,每次分割的时候让 好分割 尽可能地大,这样最终的答案就是最少的。

时间复杂度: O ( n ) O(n) O(n)

C++代码:

using LL = long long;

class Solution {
public:
    int minimumPartition(string s, int k) {
        int n = s.size() , ans = 0;
        for(int i = 0;i < n;i++){
            //可能会溢出 所以要用 long long
            LL sum = 0;
            int j = i;
            for(;j < n;j++){
                if((s[j] - '0') > k) return -1;
                sum = sum * 10 + (s[j] - '0');
                if(sum > k) break;
            }
            ans++;
            i = j - 1;
        }

        return ans;
    }
};
更多推荐

语义噪声的解释

《RobustSemanticCommunicationsAgainstSemanticNoise》定义语义噪声是一种导致误解语义信息和解码错误的噪声。它导致传输的语义符号和接收到的语义符号之间存在差异,在语义编码、数据传输和语义解码阶段都可能被引入[1]分类不同源(文本和图像等)产生语义噪声的原因是不同的:文本文本中

时序预测 | MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测

时序预测|MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测目录时序预测|MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积双向长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料预测效果基本介绍MATLAB实现POA-CNN-BiLSTM鹈鹕算法优化卷积

Android Studio插件版本与Gradle 版本对应关系

关于作者:CSDN内容合伙人、技术专家,从零开始做日活千万级APP。专注于分享各领域原创系列文章,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。目录一、导读二、概览三、Gradle各版本对应关系3.1Gradle版本3.2插件版本3.3AndroidGradle插件和AndroidStudio兼容

亚马逊云科技创新加速周:以数智化手段加速中国企业出海之旅

近年来,越来越多的中国企业正在走向国际市场,中国企业如何在出海浪潮下稳重求进?9月18日-9月22日,新一期亚马逊云科技合作伙伴加速周将为您带来“智荟出海”专题。“智荟出海计划”是亚马逊云科技发布的一项合作计划,旨在全方位资源赋能合作伙伴,以数智化手段加速中国企业的出海之旅。亚马逊云科技将携手25家合作伙伴,倾情打造为

局部变量,全局变量与内存

本文会使用IDA分析局部变量,全局变量在内存的存储目录使用IDA分析局部变量使用IDA分析全局变量总结使用IDA分析局部变量#include<stdio.h>intmain(){intnNum=1;floatfNum=2.5;charch='A';printf("int%d,float%f,char%c",nNum,f

再次理解Android账号管理体系

目录✅0.需求📂1.前言🔱2.使用2.1账户体系前提2.2创建账户服务2.3操作账户-增删改查💠3.源码流程✅0.需求试想,自己去实现一个账号管理体系,该如何做呢?——————————最近有遇到这样一个需求:AR眼镜只支持同时与一个手机绑定,即:AR眼镜已与手机绑定过的话,不再支持与其他手机绑定;如要绑定其他手机

Python语言学习实战-内置函数filter()的使用(附源码和实现效果)

实现功能filter()函数是Python的内置函数之一,用于过滤序列中的元素。它接受两个参数:一个是函数,用于判断每个元素是否符合条件;另一个是可迭代对象,包含要过滤的元素。filter()函数返回一个迭代器,其中包含所有符合条件的元素。filter()函数的语法如下:filter(function,iterable

深入理解全局变量和实例变量在 Ruby 和 Rails 中的作用

全局变量和实例变量是Ruby编程语言中的两种不同类型的变量,它们在Ruby和Rails中扮演着重要的角色。在本文中,我们将深入探讨这两种变量的特性、用途和区别。全局变量(GlobalVariables):全局变量是在整个Ruby程序中都可见的变量。它们的生命周期从Ruby进程启动时开始,直到进程结束。因此,全局变量在任

短视频seo矩阵系统源码开发搭建--代用户发布视频能力

短视频SEO矩阵系统源码开发搭建的代用户发布视频能力,主要是指在系统平台上,允许用户将其创作的内容发布到指定的账号或平台,并设置好相关的标题、话题、锚点等信息。一、搭建步骤及注意事项确定使用场景。根据业务需求,确定该功能的使用场景。例如,该功能可能被政务媒体用于内部多媒体管理平台,或被企业服务平台用于面向抖音账号的内部

websocket请求通过IteratorAggregate实现流式输出

对接国内讯飞星火模型,官方文档接口采用的是websocket跟国外chatgpt有些差异。虽然官网给出一个简单demo通过while(true),websocket的receive()可以实现逐条接受并输出给前端,但是通用和灵活度不高。不能兼容现有项目框架的流式输出。故模仿openai,采用IteratorAggreg

使用 Python 和机器学习掌握爬虫和情感分析

在本教程中,我们将抓取一个网站并使用自然语言处理来分析文本数据。最终结果将是对网站内容的情感分析。以下是我们将遵循的步骤:项目范围所需的库了解网页抓取抓取网站文本清理和预处理使用机器学习进行情感分析最后结果一、项目范围该项目的目标是抓取网站,执行文本预处理,然后应用机器学习算法对网站内容进行情感分析。换句话说,我们想要

热文推荐