LeeCode 942

题目描述:

由范围 [0,n] 内所有整数组成的 n+1 个整数的排列序列可以表示为长度为 n 的字符串 s ,其中:

  • 如果 perm[i] < perm[i + 1] ,那么 s[i] == 'I'
  • 如果 perm[i] > perm[i + 1] ,那么 s[i] == 'D'

给定一个字符串 s ,重构排列 perm 并返回它。如果有多个有效排列perm,则返回其中任何一个。

标签: 贪心选择、排序

建立模型

解法一

直观看这个题想到的就是两层排序的思路,遍历比较相邻位置的大小关系是否匹配字符串s,如果匹配则继续比较下一对;如果不匹配,则交换相邻两个数的位置,并向前比较和交换直到匹配或者越界。这种解法虽然思路非常清晰,但时间复杂度过高,效率较低。

时间复杂度:最坏情况可达\(O(N^2)\)

解法二

贪心选择的思路,如果当前字母s[i] == 'I', 则 res[i] = low 取可使用的最小值;如果当前字母s[i] == 'D', 则 res[i] = high 取可使用的最大值

时间复杂度:O(N)

编码实现

# 解法一编码实现
def diStringMatch(s: str) -> List[int]:
res = [i for i in range(len(s) + 1)]
left, right = 0, 1
while right < len(res):
i, j = left, right
while i >=0 and ((s[i] == 'I' and res[i] > res[j]) or (s[i] == 'D' and res[i] < res[j])):
res[i], res[j] = res[j], res[i]
i -= 1
j -= 1
left += 1
right += 1
return res # 解法二编码实现
def diStringMatch(s: str) -> List[int]:
low, high = 0, len(s)
res = [0 for i in range(len(s) + 1)]
for i, c in enumerate(s):
if c == 'I':
res[i] = low
low -= 1
else:
res[i] = high
high -= 1
res[len(s)] = low # 移动到最后一个元素时 low = high
return res

LeeCode 942 增减字符串匹配的更多相关文章

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

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

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

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

  3. Q942 增减字符串匹配

    给定只含 "I"(增大)或 "D"(减小)的字符串 S ,令 N = S.length. 返回 [0, 1, ..., N] 的任意排列 A 使得对于所有 i ...

  4. PHP算法之增减字符串匹配

    给定只含 "I"(增大)或 "D"(减小)的字符串 S ,令 N = S.length. 返回 [0, 1, ..., N] 的任意排列 A 使得对于所有 i ...

  5. 字符串匹配的KMP算法

    ~~~摘录 来源:阮一峰~~~ 字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”ABCDABD”? 许 ...

  6. {Reship}{KMP字符串匹配}

    关于KMP字符串匹配的介绍和归纳,作者的思路非常清晰,推荐看一下 http://blog.csdn.net/v_july_v/article/details/7041827

  7. 字符串匹配(hash算法)

    hash函数对大家来说不陌生吧 ? 而这次我们就用hash函数来实现字符串匹配. 首先我们会想一下二进制数. 对于任意一个二进制数,我们将它化为10进制的数的方法如下(以二进制数1101101为例): ...

  8. 【C++实现python字符串函数库】二:字符串匹配函数startswith与endswith

    [C++实现python字符串函数库]字符串匹配函数startswith与endswith 这两个函数用于匹配字符串的开头或末尾,判断是否包含另一个字符串,它们返回bool值.startswith() ...

  9. sdut 2125串结构练习--字符串匹配【两种KMP算法】

    串结构练习——字符串匹配 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目链接:http://acm.sdut.edu.cn/sduto ...

  10. C语言字符串匹配函数

    C语言字符串匹配函数,保存有需要时可以用: #include <stdio.h> #include <stdlib.h> #include <string.h> # ...

随机推荐

  1. JS笔记(二):数据类型

    镇楼图 Pixiv:torino 三.数据类型 原始类型 原始类型像是string.symbol.number之类的都只能存储原子值,而不能像对象一样随意扩展.但是为了提供额外功能,采取了轻量的对象包 ...

  2. Vue+SSM+Element-Ui实现前后端分离(2)

    前言:后台使用ssm搭建,对以前学习知识的一个回顾,与此同时来发现自己不足.这里主要采用配置文件方式进行,有部分注解. 目标:搭建ssm框架,并测试成功:(其中也有aop切面的编写) 一.开发工具 I ...

  3. String类、StringBuffer类、StringBuilder类

    String类.StringBuffer类.StringBuilder类 String类的创建 // 方式一 直接赋值 String s = "woshihaoren"; // 方 ...

  4. Javaheima20

    Java 学习内容 单元测试 反射 注解 动态代理 开发好的系统中存在很多的方法,如和对这些方法的正确性进行测试 如何在程序运行时取得到Class对象,然后取获得Class中的每个成分 注解是什么,具 ...

  5. 实验2 C语言分支语句、循环语句应用编程

    一.实验目的 掌握格式化输出函数printf()和格式化输入函数scanf()的用法 掌握单个字符输出函数putchar()和单个字符输入函数getchar()的用法 理解结构化程序设计的三种基本结构 ...

  6. Android Studio查看指定APP日志

    1.启动Android Studio 2.View->Tool Windows->Terminal   3.在底部输入monitor 4.Android Devices Monitor新窗 ...

  7. C Ⅷ

    数组  int number[100];   //这个数组可以放100个数 int x; int cnt = 0; double sum = 0; scanf("%d", & ...

  8. python 猜数字

    方法一 import randomif __name__ == '__main__':    yourname = input("你好! 你的名字是什么?\n");    prin ...

  9. 简介及spring mvc初体验

    一.C\S和B\S C/S C/S 是 Client/Server 的简写,简称客户端/服务器模式.例如 QQ 是客户端和服务器模式,首先安装一个客户端到个人电脑,然后登入到腾讯服务器. 缺点:更新不 ...

  10. TAP 交换机

    首发第一篇,就想分享一下TAP交换机的网络设备,为啥要谈这个呢,因为是一个冷门产品,大厂一般都没有,有也不作为重点产品推介,所以关注的人少,希望能给有这方面需求的人,又苦于找不到介绍资料的人以帮助.在 ...