每日一题 --- 942. 增减字符串匹配[力扣][Go]

简介: 每日一题 --- 942. 增减字符串匹配[力扣][Go]

题目:

由范围 [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,则返回其中 任何一个 。

示例 1:

输入:s = “IDID”

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

示例 2:

输入:s = “III”

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

示例 3:

输入:s = “DDI”

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

提示:

1 <= s.length <= 105

s 只包含字符 “I” 或 “D”

解题代码:

func diStringMatch(s string) []int {
  var ans = make([]int, 0)
  h := len(s)
  l := 0
  // 确定第一位是最高还是最低
  for len(s) != 0 {
    u := s[0]
    long := 0
    if len(ans) == 0 {
      if u == uint8('I') {
        ans = append(ans, l)
        long = strings.Index(s, "D")
        if long == -1 {
          long = len(s)
        }
        for i := 1; i <= long; i++ {
          ans = append(ans, h-long+i)
        }
        h -= long
        l ++
      } else {
        ans = append(ans, h)
        long = strings.Index(s, "I")
        if long == -1 {
          long = len(s)
        }
        for i := 1; i <= long; i++ {
          ans = append(ans, l+long-i)
        }
        l += long
        h --
      }
    } else {
      if u == uint8('I') {
        long = strings.Index(s, "D")
        if long == -1 {
          long = len(s)
        }
        for i := 1; i <= long; i++ {
          ans = append(ans, h-long+i)
        }
        h -= long
      } else {
        long = strings.Index(s, "I")
        if long == -1 {
          long = len(s)
        }
        for i := 1; i <= long; i++ {
          ans = append(ans, l+long-i)
        }
        l += long
      }
    }
    //fmt.Printf("s=%s,ans=%v\n",s,ans)
    s = s[long:]
  }
  return ans
}

时间复杂度O(n*m),还行吧,在go组中执行用时击败100%,但是内存消耗过高。


相关文章
|
2月前
|
并行计算 Go C++
2182.构造限制重复的字符串(模拟 贪心 优先队列 C++ Go)
【2月更文挑战第19天】2182.构造限制重复的字符串(模拟 贪心 优先队列 C++ Go)
23 1
|
2月前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
34 6
|
5月前
|
安全 Java 编译器
Go 字符串拼接方式
Go 字符串拼接方式
26 0
|
6月前
|
Go
go string to int 字符串与整数型的互换
go string to int 字符串与整数型的互换
35 0
|
1月前
|
供应链 Go C语言
掌握Go语言:探索Go语言基础,字符串连接、关键字、空格、格式化字符串的重要性(7)
掌握Go语言:探索Go语言基础,字符串连接、关键字、空格、格式化字符串的重要性(7)
|
8月前
|
存储 编译器 Go
Go 语言内置类型全解析:从布尔到字符串的全维度探究
Go 语言内置类型全解析:从布尔到字符串的全维度探究
58 0
|
5天前
|
Go
|
13天前
|
编解码 JavaScript 前端开发
【专栏】介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例
【4月更文挑战第29天】本文介绍了字符串Base64编解码的基本原理和在Java、Python、C++、JavaScript及Go等编程语言中的实现示例。Base64编码将24位二进制数据转换为32位可打印字符,用“=”作填充。文中展示了各语言的编码解码代码,帮助开发者理解并应用于实际项目。
|
19天前
|
存储 Go 开发者
Golang深入浅出之-Go语言字符串操作:常见函数与面试示例
【4月更文挑战第20天】Go语言字符串是不可变的字节序列,采用UTF-8编码。本文介绍了字符串基础,如拼接(`+`或`fmt.Sprintf()`)、长度与索引、切片、查找与替换(`strings`包)以及转换与修剪。常见问题包括字符串不可变性、UTF-8编码处理、切片与容量以及查找与替换的边界条件。通过理解和实践这些函数及注意事项,能提升Go语言编程能力。
25 0
|
2月前
|
Go C++
【力扣】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)
【2月更文挑战第17天】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)
32 8