【LeetCode】942. 增减字符串匹配

182 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

  • 题目示例

  • 题目解析

    • 1 <= s.length <= 105
    • s 只包含字符 "I""D"

二、思路分析:

我们阅读题意,可知给出的字符串s中只包含"I" "D" ,要求对字符串s(长度为 n)规律返回一个整数prem (长度为n+1)的列表。

其中字符"I" "D"代表的规律为:

  • "I": prem[i] < prem[i+1],prem[i+1]元素是相对递增的

    image.png

  • "D":prem[i] > prem[i+1],prem[i+1]元素是相对递减的 image.png

  • 查看题目给出的示例1,我们画图分析如下所示,

    • s字符串:“IDID”
    • prem列表可以为:[0,4,1,3,2],[0,4,2,3,1]...只要符合"增减增减"的规律都可以

    image.png

题目要求,prem列表的元素不能重复,因此在对字符串s遍历时,每取完一个索引,则索引集合减去一个索引元素。对字符串"IDID"进行推导,如下:

  • 字符串s="IDID",n+1 索引坐标则为[0,1,2,3,4]五个数值
  • 当s[0]="I"时,则在|0,1,2,3,,4|取出最小数如 0,prem=[0]
  • 当s[1]="D"时,则在|1,2,3,4|取出最大数如4,prem=[0,4]
  • 当s[2]="I"时,则在|1,2,3|取出最小数1,prem=[0,4,1]
  • 当s[3]="D"时,则在|2,3|取出最大数3,prem=[0,4,1,3]
  • 最后还剩下|2|,prem列表添加到,prem=[0,4,1,3,2]

根据以上,思路我们可以快速实现出如下代码:

class Solution(object):

    def diStringMatch(self, s):

        """

        :type s: str

        :rtype: List[int]

        """

        n = len(s)+1

        tmp = list(range(n))

        ans = []

        for i  in range(len(s)):

            if s[i] == "I" :

                ans.append(min(tmp))

                tmp.remove(min(tmp))


            if s[i] == "D" :

                ans.append(max(tmp))

                tmp.remove(max(tmp))

        ans = ans + tmp

        return ans

但是,我们提交代码一看,AC记录要4000多秒,时间太长了。

如何保证,提高我们程序的计算效率呢?

方法:双指针

  • 定义两个变量,left和right
  • Left 指向字符串s的开始位置
  • right指向字符串s的len(s)位置
  • 通过for循环遍历字符串s,当s[i]=="I"时,则res.append(left),left +=1
  • 当s[i]=="D"时,则res.append(right),right -=right
  • 自到遍历完整个字符串s后,res.append(left)

image.png

根据以上思路,我们使用python能快速的实现出来:

class Solution(object):

    def diStringMatch(self, s):

        """
        :type s: str

        :rtype: List[int]

        """

        ans = []

        left,right = 0,len(s)

        for i  in range(len(s)):

            if s[i] == "I" :

                ans.append(left)

                left = left +1

            else:

                ans.append(right)

                right = right -1

        ans.append(left)

        return ans

三、总结:

本期,我们继续使用双指针思想解答题目。该题主要考察的是找出增减规律,结合双指针就可以AC该题了。

  • 时间复杂度O(N),N为字符串s的长度
  • 空间复杂度O(1),返回值不计入

以上是本期内容,欢迎大佬们点赞评论,下期见