这是悦乐书的第361次更新,第388篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第223题(顺位题号是942)。给定仅包含I(增加)或D(减少)的字符串S,令N = S.length

返回元素值范围为[0,1,…,N]的整型数组A,使得对于所有i = 0,…,N-1:

  • 如果S[i] =='I',那么A[i] < A[i + 1]。

  • 如果S[i] =='D',那么A[i] > A[i + 1]。

例如:

输入:“IDID”

输出:[0,4,1,3,2]

输入:“III”

输出:[0,1,2,3]

输入:“DDI”

输出:[3,2,0,1]

注意

  • 1 <= S.length <= 10000

  • S仅包含字符I或D。

02 第一种解法

题目的意思是,给了一个字符串,字符串中只包含字符ID,遇到I表示要增加,取值顺序是[0,1,2,...,n],而D则下降,取值顺序是[n,n-1,n-2,...,0],而通过观察题目中的例子,结果数组的长度要比S的长度多一位,那么在算完增减后,最后一位元素则需要计算一番才能得出。

我们来分析下题目中的例一,以便更好理解题目,S = "IDID",结果数组A = [0,4,1,3,2],我们先不看A中的第五个元素,只看前四个元素是怎么来的。

S[0]='I',表示增加,所以A[0]=0S[2]='I',继续增加,而前面在第一位已经加过一次,所以A[2]=1S[1]S[3]都等于'D',都做减法,从4开始,所以A[1]=4A[3]=3,整合起来,A中的前四位元素就是[0,4,1,3]了。

A的最后一位元素,可以通过算0到n的和减去已经从[0,n]中取过元素之和的差来得到,而0到n的和是一个公差为1的等差数列,利用求和公式很快就可以算出,另外一个和,我们可以定义一个变量sum,在每次从[0,n]中取值时就累加一个,算出差值后,赋值给结果数组最后一位元素即可。

class Solution {
public int[] diStringMatch(String S) {
int n = S.length(), i = 0, d = S.length();
int[] result = new int[n+1];
int index = 0;
int sum = 0;
for (int j=0; j<n; j++) {
char c = S.charAt(j);
if (c == 'I') {
sum += i;
result[index++] = i++;
} else {
sum += d;
result[index++] = d--;
}
}
result[n] = (n+1)*n/2 - sum;
return result;
}
}

03 第二种解法

在第一种解法中,我们计算结果数组result的最后一位元素是通过等差数列求和再减去已经累加的和得到的,但是通过分析,我们可以发现,要找剩下的元素,在n不断递减、i不断递增的情况下,最后剩下的值肯定在中间,和相遇问题类似。例如,0,1,2,3,4,4减2次到达2,0加两次到达2,而2正好是经过4此计算后剩下的元素。换成其他的数组合,结论依旧。

所以,数组最后一个元素,可以取i,也可以取d,效果一样。

class Solution {
public int[] diStringMatch(String S) {
int n = S.length(), i = 0, d = S.length();
int[] result = new int[n+1];
int index = 0;
for (int j=0; j<n; j++) {
char c = S.charAt(j);
if (c == 'I') {
result[index++] = i++;
} else {
result[index++] = d--;
}
}
// result[n] = d; 效果等价
result[n] = i;
return result;
}
}

04 小结

算法专题目前已连续日更超过七个月,算法题文章229+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode.942-DI字符串匹配(DI String Match)的更多相关文章

  1. LeetCode 942. 增减字符串匹配(DI String Match) 49

    942. 增减字符串匹配 942. DI String Match 题目描述 每日一算法2019/6/21Day 49LeetCode942. DI String Match Java 实现 and ...

  2. LeetCode 686. 重复叠加字符串匹配(Repeated String Match)

    686. 重复叠加字符串匹配 686. Repeated String Match 题目描述 给定两个字符串 A 和 B,寻找重复叠加字符串 A 的最小次数,使得字符串 B 成为叠加后的字符串 A 的 ...

  3. [Swift]LeetCode686. 重复叠加字符串匹配 | Repeated String Match

    Given two strings A and B, find the minimum number of times A has to be repeated such that B is a su ...

  4. [Swift]LeetCode942. 增减字符串匹配 | DI String Match

    Given a string S that only contains "I" (increase) or "D" (decrease), let N = S. ...

  5. [LeetCode] Wildcard Matching 字符串匹配,kmp,回溯,dp

    Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. ...

  6. LeetCode 10 Regular Expression Matching(字符串匹配)

    题目链接 https://leetcode.com/problems/regular-expression-matching/?tab=Description   '.' Matches any si ...

  7. JavaScript 字符串匹配 | JS 的正则用法 | 从后边匹配

    // 字符串匹配命令是 match,不是 replace var text = "http://123.com/456.html" ; window.alert(text.matc ...

  8. #Leetcode# 942. DI String Match

    https://leetcode.com/problems/di-string-match/ Given a string S that only contains "I" (in ...

  9. 【Leetcode_easy】942. DI String Match

    problem 942. DI String Match 参考 1. Leetcode_easy_942. DI String Match; 完

随机推荐

  1. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    $ POJ~1038~~\times Bugs~Integrated~Inc: $ (复杂的状压DP) $ solution: $ 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前 ...

  2. 胡昊—第6次作业—static关键字、对象

    #题目1:编写一个类Computer,类中含有一个求n的阶乘的方法.将该类打包,并在另一包中的Java文件App.java中引入包,在主类中定义Computer类的对象,调用求n的阶乘的方法(n值由参 ...

  3. 基于树莓派2代的DIY无线路由器

    最近手上多了一个树莓派2代,于是折腾就这么开始了. 因为总是得要个显示屏或者路由器或者插根网线才能玩,有点麻烦,所以有了此文. 设备清单: 树莓派2代 EDUP EP-N8508GS无线网卡(USB) ...

  4. qt5--模态对话框和非模态对话框

    视频教程:https://www.bilibili.com/video/av51766541/?p=20 #include "win.h" #include <QMenuBa ...

  5. 【51nod1792】Jabby's segment tree

    题目 线段树是一种经典的数据结构,一颗[1,n]的线段树他的根是[1,n],当一个线段树的结点是[l,r]时,设mid=(l+r)>>1,则这个结点的左儿子右儿子分别是[l,mid],[m ...

  6. 处理离散型特征和连续型特征共存的情况 归一化 论述了对离散特征进行one-hot编码的意义

    转发:https://blog.csdn.net/lujiandong1/article/details/49448051 处理离散型特征和连续型特征并存的情况,如何做归一化.参考博客进行了总结:ht ...

  7. 创建本地repo源

    1,保留rpm包 yum 安装时保留包至指定目录 编辑/etc/yum.conf 将keepcache的值设置为1: 2,使用插件 1,yum-plugin-downloadonly插件 sudo y ...

  8. Makefile样例

    Makefile1 src = $(wildcard ./*cpp) obj = $(patsubst %.cpp, %.o,$(src)) target = test $(target) : $(o ...

  9. Android的SQLite基本操作

    涉及SQLite的增删改查,结果用log显示 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ...

  10. C++读入神器——文操快读(oj也可以用)

    当某天,本蒟蒻沉迷于卡常的时候: 我-- 突然,YYKdalao说:用文操快读啊! 然后 喔-目瞪口呆 不多说,上源码: 本来用的读入方式: inline void Read( int &x ...