LeetCode.942-DI字符串匹配(DI String Match)
这是悦乐书的第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 第一种解法
题目的意思是,给了一个字符串,字符串中只包含字符I
和D
,遇到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]=0
,S[2]='I'
,继续增加,而前面在第一位已经加过一次,所以A[2]=1
。S[1]
和S[3]
都等于'D'
,都做减法,从4开始,所以A[1]=4
,A[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)的更多相关文章
- LeetCode 942. 增减字符串匹配(DI String Match) 49
942. 增减字符串匹配 942. DI String Match 题目描述 每日一算法2019/6/21Day 49LeetCode942. DI String Match Java 实现 and ...
- LeetCode 686. 重复叠加字符串匹配(Repeated String Match)
686. 重复叠加字符串匹配 686. Repeated String Match 题目描述 给定两个字符串 A 和 B,寻找重复叠加字符串 A 的最小次数,使得字符串 B 成为叠加后的字符串 A 的 ...
- [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 ...
- [Swift]LeetCode942. 增减字符串匹配 | DI String Match
Given a string S that only contains "I" (increase) or "D" (decrease), let N = S. ...
- [LeetCode] Wildcard Matching 字符串匹配,kmp,回溯,dp
Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. ...
- LeetCode 10 Regular Expression Matching(字符串匹配)
题目链接 https://leetcode.com/problems/regular-expression-matching/?tab=Description '.' Matches any si ...
- JavaScript 字符串匹配 | JS 的正则用法 | 从后边匹配
// 字符串匹配命令是 match,不是 replace var text = "http://123.com/456.html" ; window.alert(text.matc ...
- #Leetcode# 942. DI String Match
https://leetcode.com/problems/di-string-match/ Given a string S that only contains "I" (in ...
- 【Leetcode_easy】942. DI String Match
problem 942. DI String Match 参考 1. Leetcode_easy_942. DI String Match; 完
随机推荐
- C#中引用参数ref和输出参数out
引用参数 用于按引用传递自变量. 为引用参数传递的自变量必须是具有明确值的变量,并且在方法执行期间,引用参数指明的存储位置与自变量相同. 引用参数使用 ref 修饰符进行声明. 输出参数 用于按引用传 ...
- IView 给Submenu增加click事件失效解决方案
在浏览器中,打开开发者选项(F12) 找出对应的class,给其添加一个点击事件,就可以了. 具体的 document 操作,看这里 ----> https://www.cnblogs.co ...
- dirname命令和basename命令
dirname返回文件所在目录路径,而basename则相反,去掉路径返回最后的文件名. direname: 用途 从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的 ...
- html访问全过程
1)解析Web页面的URL,得到Web服务器的域名 2)通过DNS服务器获得Web服务器的IP地址 3)与Web服务器建立TCP连接 4)与Web服务器建立HTTP连接 5)从Web服务器获得URL指 ...
- C# Stopwatch 延时
using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading ...
- python获取网络图片
方式1 使用urllib库 import urllib.request import os ,stat url = "https://cn.bing.com/th?id=OHR.Lidong ...
- pycharm中调用函数方法自动补全p,m,c,v,f分别是什么意思
p:parameter 参数m:method 方法c:class 类v:variable 变量f:function 函数
- 动态调用WebService接口的几种方式
一.什么是WebService? 这里就不再赘述了,想要了解的====>传送门 二.为什么要动态调用WebService接口? 一般在C#开发中调用webService服务中的接口都是通过引用过 ...
- TensorFlow写的神经网络不work的原因
for epoch in range(training_steps): with tf.Session() as sess: sess.run(tf.global_variable_initializ ...
- C++入门经典-例5.7-调用自定义函数交换两变量值,传入指针
1:代码如下: // 5.7.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...