LintCode 253: Minimum Type Way (双序列DP好题)

Leetcode 253:Meeting Rooms II(超详细的解法!!!) Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si < ei), find the minimum number of conference rooms required. For example, Given [[0, 30],[5, 10]... 阅读详情

253. Minimum Type Way

You are given a string only contains lower or upper English characters that you want to type.
At the beginning, the Capslock is off, it's at a state of lower characters, you are required that after typing it should still be at lower state.
There are three kinds operations:

  1. Type a character, the screen will print a character at corresponding state (lower or upper). You hit the keyboard once.
  2. Press Capslock, switch the state of the keyboard. You hit the keyboard once.
  3. Press Shift with some character, the screen will print a character at a opposite state. You hit the keyboard twice. e.g. It will print 'P' when you press Shift + 'p'.

Example

Input:
"Hello"
Output:
6

Clarification

The type steps:Shift + 'h', 'e', 'l', 'l', 'o'.

Notice

The length of the string is N, 1≤N≤10​5​​.

Input test data (one parameter per line)How to understand a testcase?

解法1:
这题想了好久。我开始的解法不对。参考的别人的思路。

这题难在有几种组合混在一起。对于每个字母,无论大写或小写,都可以通过按CAP键与否和按SHIFT键与否来实现。这种情况可以通过DP来解决,保证不会遗漏中间的情况。

双序列DP: upper[i]表示当前为第i个字符,CAP键按下时所需的最少按键,lower[i]表示当前为第i个字符,CAP键未按下时所需的最少按键。那么,

当第i个字符为大写字母时:
upper[i]如果由upper[i-1]来实现,其值直接加1即可。因为CAP键已经按下,不需再按SHIFT键,
upper[i]如果由lower[i-1]来实现,其值必须加2。因为CAP键未按下,必须要按下CAP键,再敲第i个字符。
lower[i]如果由upper[i-1]来实现,其值必须加2。因为CAP键已经按下,必须要再按CAP键消掉大写功能,再直接敲第i个字符。
lower[i]如果由lower[i-1]来实现,其值必须加2。因为CAP键未按下,必须要按SHIFT键来实现大写。

当第i个字符为小写字母时:
upper[i]如果由upper[i-1]来实现,其值必须加2。因为CAP键已经按下,必须再按SHIFT键来实现小写。
upper[i]如果由lower[i-1]来实现,其值必须加2。因为CAP键未按下,必须要按下CAP键,再敲第i个字符。
lower[i]如果由upper[i-1]来实现,其值必须加2。因为CAP键已经按下,必须要再按CAP键消掉大写功能,再直接敲第i个字符。
lower[i]如果由lower[i-1]来实现,其值直接加1即可。因为CAP键未按下,也不需要按SHIFT键就可以实现小写。

代码如下:

class Solution {
public:
    /**
     * @param str: the string you wanna print.
     * @return: return the minimum times you need to hit the keyboard.
     */
    int minimumTyping(string &str) {
        int n = str.size();
        vector<int> upper(n);
        vector<int> lower(n);
        
        if (isupper(str[0])) {
            upper[0] = 2;
            lower[0] = 2;
        } else {
            upper[0] = 2;
            lower[0] = 1;
        }

        for (int i = 1; i < n; ++i) {
            if (isupper(str[i])) {
                upper[i] = min(upper[i - 1] + 1, lower[i - 1] + 2);
                lower[i] = min(upper[i - 1] + 2, lower[i - 1] + 2);
            } else {
                upper[i] = min(upper[i - 1] + 2, lower[i - 1] + 2);
                lower[i] = min(upper[i - 1] + 2, lower[i - 1] + 1);
            }
        }
        
        return lower.back();
    }
};

 

车载通信技术原理-CAN通讯和代码配置:奥迪A6轿车总线拓扑图 CAN总线是一种用于汽车监测与控制系统的串行通信协议,由德国Bosch公司开发。它具有多主工作方式、优先级仲裁、高抗干扰等特点,支持点对点、广播等多种通信方式,传输距离可达10公里。CAN协议采用差分信号传输,物理层使用双绞线,数据链路层实现错误检测、位填充等功能。协议帧类型包括数据帧、遥控帧、错误帧等。CAN总线自1986年发布以来,已成为汽车电子系统的标准配置,广泛应用于车载网络。文章还提供了S32K144芯片的CAN驱动代码示例。 阅读详情

相关推荐

大语言模型在构建UNSPSC 分类数据中的应用

UNSPSC 是联合国标准产品和服务代码。本文研究如何利用大语言模型生成分类系统的分析

姚家湾博客 1855

关于双序列的dp问题分析

双序列问题的dp心得

m0_50292065的博客 345

VSCode下载、安装+C语言环境配置(超详细)

ps:我的更改部分:"D:/BaiduNetdiskDownload/x86_64-8.1.0-release-win32-seh-rt_v6-rev0/mingw64。③ 找到【系统变量】中的【Path】变量 ---- 双击打开后,将刚刚复制的地址添加进去 ---- 点击【确定】;① 双击【此电脑】---- 点击【属性】---- 进入到下面这个界面,单击【高级系统设置】;② 进入到 系统属性界面 ---- 点击【环境变量】,进入环境变量页面;并进行安装,安装成功后,打开VSCode;

weixin_48820458的博客 1万+

双序列DP

1. 两个子序列的最大点积 https://leetcode-cn.com/problems/max-dot-product-of-two-subsequences/ 给你两个数组nums1和nums2。 请你返回 nums1 和 nums2 中两个长度相同的 非空 子序列的最大点积。 数组的非空子序列是通过删除原数组中某些元素(可能一个也不删除)后剩余数字组成的序列,但不能改变数字间相对顺序。比方说,[2,3,5]是[1,2,3,4,5]的一个子序列而[1,5,3]不是。 ...

HackingGate的博客 704

Cocos Creator Android打包:NDK版本选择与配置全攻略

在Android原生开发中,NDK(Native Development Kit)是编译C/C++代码的核心工具链,它决定了代码如何被编译为不同CPU架构(如ARMv7、ARM64)的动态库。其工作原理在于提供了一套完整的交叉编译环境,将高级语言代码转化为设备可执行的二进制指令。这一技术对于游戏引擎和性能敏感型应用至关重要,因为它能直接调用硬件资源,提升运行效率。在实际工程中,NDK版本必须与Android Gradle插件(AGP)版本、项目依赖的C++标准库精密匹配,否则会导致编译失败或运行时崩溃。特别

weixin_33725270的博客 490

UMI刷盘机器人代码实战:从SLAM到Diffusion Policy的完整部署流程

本文详细解析了UMI(Universal Manipulation Interface)刷盘机器人从数据准备到真实部署的完整实战流程。通过SLAM处理视频数据生成三维轨迹,并训练Diffusion Policy模型,最终将策略部署到UR5机械臂与WSG50夹爪上,实现从模仿学习到物理执行的闭环。

weixin_29042035的博客 461

动态规划之双序列DP问题题集

动态规划之双序列DP问题 文章目录动态规划之双序列DP问题最长公共子序列(动规)正则表达式匹配(动规)通配符匹配(动规)编辑距离(动规)不相交的线(动规-LCS)交错字符串(动规)(动规2)(动规空间优化)不同的子序列(动规)两个字符串的删除操作(动规)最长公共子数组(动规)(动规-空间优化)最短公共超序列(动规) 最长公共子序列 (动规) 最长公共子序列问题是最经典的双序列的DP问题,因为涉及到两个序列共同的部分,所以使用二维的DP数组来表示,而公共子序列的可以在循环的内部判断。 1.状态定义 dp[

_zhy_cq 474

[Linux外设驱动详解]RK3588 U-Boot网络功能深度分析

本文深入分析了RK3588平台上U-Boot的网络功能实现,主要内容包括: 网络架构:详细剖析了从硬件层到协议层的完整网络栈架构,包括GMAC驱动、TFTP/NFS启动、网络命令等关键组件。 驱动实现:重点介绍了RK3588 GMAC驱动结构,包含关键数据结构、专用操作函数集、设备树兼容性配置和GRF寄存器设置。 功能实现:详细说明了驱动初始化流程、RGMII速度适配机制以及PHY接口配置过程。 高级特性:涵盖了网络启动功能、镜像更新和MAC地址传递到Linux内核的机制。 文档通过代码片段和流程图清晰展示

Just Linux! 1113

dp基础之双序列型最短编辑距离Edit Distance

问题:给定连个字符串A、B,要求把A变成B,可以进行如下操作,问最少的操作次数可以使A变成B,即最小编辑距离? 操作:增加(插入)、删、替换 例: A = ['m','a','r','t'],B = ['k','a','r','m','a'] 输出:3(m换成k,t换成m,加上a) 问题分析:设m = len(A),n = len(B),我们考虑最后,操作完成后,A的长度也变成n,A[n-1] ...

lerry13579的博客 400

第三章-python基础语法

有C语言基础应该这样学 Python。

qq_46187594的博客 1175

31、车载通信中的可见光通信(VLC)技术解析

本文详细解析了车载通信中可见光通信(VLC)技术的应用背景、优势及发展前景。对比传统RF通信技术(如DSRC),VLC利用LED照明设备实现高效、安全的车辆与车辆、车辆与基础设施之间的通信,具有频谱资源丰富、安全性高、无电磁干扰等优势。文章还探讨了VLC在交叉口交通控制、高速公路通信、自动驾驶等场景的应用潜力,展望了其在未来智能交通系统中的重要作用。

hill8的博客 318

【算法训练-动态规划 三】【双序列DP问题】最长重复子数组、最长公共子串、最长公共子序列、编辑距离

对于本题而言,可以定义dp[i][j]表示和的最长公共子序列。表示的是 text1 的 第 0 个元素到第 i - 1 个元素,两端都包含) 之所以dp[i][j]的定义不是text1[0:i]和text[0:j],是为了方便当 i = 0 或者 j = 0 的时候,dp[i][j]表示空字符串和另外一个字符串的匹配,这样dp[i][j]可以初始化为空字符串对于本题而言,可以定义dp[i][j]表示和的最长公共子序列。表示的是 text1 的 第 0 个元素到第 i - 1 个元素,两端都包含) 之所以。

MaoLin Tian's Blog 1124

超临界二氧化碳发电技术深度解析

超临界二氧化碳发电技术正在突破传统热电转换的物理边界。作为新一代发

硬核科技 601

动态规划解题模版:双序列型

动态规划:双序列型 双序列型,就是有两个子序列/字符串,每个序列本身是一维的,可以转换为二维dp,序列型开数组开n+1,双序列型也是开n+1。 突破口:看串A和串B的最后一个字符是否匹配,是否需要串A/串B的最后一个字符,来缩减规模。 两种类型:计数型:情况1+情况2+…以及最值型min/max{情况1,情况2…} 初始条件:要特别当心空串的处理。 1、LintCode 77 Longest Co...

0xac001d09 491

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

luogu4728 双递增序列 (dp)

设f[i][j]表示以i位置为第一个序列的结尾,第一个序列的长度为j,第二个序列的结尾的最小值 那么对于f[i][j],有转移$f[i+1][j+1]=min\{f[i+1][j+1],f[i][j]\}$;$f[i+1][i-j+1]=min\{f[i+1][i-j+1],a[i+1]\}$,如果能满足递增的话 1 #include<bits/stdc++.h> 2 #...

weixin_30487701的博客 165

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jzoj5220 【GDOI2018模拟7.10】C (双序列dp)

题意给定字符串A,B,求长度为A,B的最长公共子序列长度 的X串子序列在Y中有出现过的个数。 n<=1000 注意理解题意: 首先是X串的子序列(只要取的位置不同就是不同的子序列),然后长度为两者最长公共子序列的长度,然后有在Y串中出现过,这样就是1的贡献。 并不等价于最长公共子序列的对数!分析先求出f[i][j]表示最长公共子序列的长度。 再设g[i][j]表示只考虑a[1..i],b[1

一位蒟蒻的小博客 497

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

HDU 动态规划(46道题目)倾情奉献~ 【只提供思路与状态转移方程】

Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955     背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱  最脑残的是把总的概率以为是抢N家银行的概率之和… 把状态转移方程写成了f[j]=max{f[j],f[j-q[i].v]+q[i].money}(f[j]表示在概率j之下能抢的大洋);

遇见_缘 4836

【面试高频题】难度 3/5,可直接构造的序列 DP 题

题目描述 这是 LeetCode 上的 「1537. 最大得分」 ,难度为 「困难」。 Tag : 「前缀和」、「构造」、「双指针」、「序列 DP」、「动态规划」 你有两个 有序 且数组内元素互不相同的数组 nums1 和 nums2 。 一条 合法路径 定义如下: 选择数组 nums1 或者 nums2 开始遍历(从下标 处开始)。从左到右遍历当前数组。如果你遇到了 nums1 和 nums2 中都存在的值,那么你可以切换

宫水三叶的刷题日记 926

序列DP问题

70. Climbing Stairs You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? Not

格物致知 389

【DP入门】动态规划初步-几类子序列问题

动态规划初步—子序列问题,本文包括:最大连续子序列和,最大(长)上升子序列,最大(长)公共子序列1.最大连续子序列和找出一维数组中和最大的连续子序列,状态转移方程如下: sum=max(a[i]+sum,a[i]);sum = max(a[i]+sum , a[i] );例题:HDU 1003-Max Sum(最大连续子序列和)注:此题由于要输出和最大序列的起始位置和终止位置,形式与上列公式有所出

Chen_yuazzy的博客 1197

leetcode——双序列DP系列

文章目录最长公共子序列交错字符串编辑距离 最长公共子序列 leetcode好像没有这个题,取lintcode找了一个,结果不能用C#。。。于是写出了时隔N年的第一段Java代码。。 public int longestCommonSubsequence(String A, String B) { // write your code here int m = A.length();...

Sophie1797的博客 360

【精】LintCode领扣算法问题答案:253. 最少打字方式

253. 最少打字方式 描述 给出一个只包含大小写英文字符的字符串,你需要打出这个字符串。 一开始键盘的 Capslock 是关闭的,即小写状态,要求打出这个字符串后还是小写状态。 你可以进行以下三种操作: 输入一个字符,屏幕上将打印出一个相应大小写状态的字符。视为敲击 1 次键盘。 按下 Capslock,切换键盘当前的大小写状态。视为敲击 1 次键盘。 按下 Shift 加某个字符,屏幕上将打印出一个与当前大小写状态相反的字符。视为敲击 2 次键盘。例如小写状态上,Shift + ‘p’ 将会输出 ‘

二当家的白帽子 334

(RQoj 15 采药------rwkj 10.1.5.253 1447) 动态规划 DP 1

rqnoj 15 采药 原创2015年12月14日 09:03:20 标签: c语言 411 题目描述   辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它...

weixin_30872733的博客 176

关于android的单位dp,dip

摘要         本文介绍了android单位dp,dip的概念,并给出了它的确切含义。 概述         Android中,dp是Density-independent Pixels简写,而dip则是Density Independent Pixels,实际上指的是一个概念,都是Android的单位。在文档More Resource Types中有描述:

陈俞飞的专栏 4万+

关于解决service 'sapdp00' not found的办法

<br />朋友们,你是否有时候会遇到SAP连接不上的问题,错误提示像下面这样:<br /><br />Service ‘Sapdp00’ unknown<br />Time Tue May 25 17:21:48 2006 <br />Component NI (network interface) <br />Release 640 <br />Version 37 <br />Module ninti.c <br />Line 505 <br />Method NiPGetServByName2: s

wnowspsu的专栏 4020

LintCode刷题(容易篇 一)

LintCode 1.二分法 2.A+B问题 3.二进制求和 4.各位相加 5.判断是否为平方数之和

秋名山小尼玛的博客 1532
上一篇: LintCode 874: Maximum Vacation Days (DP好题)
下一篇: LintCode 260: Same Diagonal Elements
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值