【LeetCode】1422. 分割字符串的最大得分

109 阅读2分钟

image.png

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情

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

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

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 2 <= s.length <= 500
    • 字符串 s 仅由字符 '0' 和 '1' 组成。

二、思路分析:

我们读取本题,题目内容要求对字符串按照左字符串和右字符串划分,计算出分割字符串最大得分。那么左字符串和右字符串是怎么划分,我们继续审题:

  • 字符串s是由 0 和 1组成
  • 左字符串和右字符串分割成两个非空字符串
  • 左子字符串中只计算字符0的数量
  • 右子字符串中只计算字符1的数量

根据题目内容,我们可以直接使用模拟方法,解答即可:

  • 方法一:模拟方法

    • 字符串s进行分片,左子字符串s[:i],右子符串s[i:]
    • 左子字符串s[:i].count("0")
    • 右子字符串s[i:].count("1")
      class Solution(object):
          def maxScore(self, s):
              """
              :type s: str
              :rtype: int
              """
              ans = 0
              for i in range(1,len(s)):
                  left = s[:i].count("0")
                  right = s[i:].count("1")
                  Sum = left + right
                  ans = max(ans,Sum)     
              return ans
      
  • 方法二:两次遍历

    • 第一次遍历求出左子字符串中只有一个字符时,右子字符串1的次数,赋值给ans和tmp
    • 第二次遍历s字符串从[1:-1],左字符串开始取值
    • 当s[i] == "0",则最大数tmp +1
    • 当s[i] == "1",则最大数tmp -1
      class Solution(object):
          def maxScore(self, s):
              """
              :type s: str
              :rtype: int
              """
              score1 = s[1:].count("1")
              score0 = 1 if s[0] == "0" else 0
              tmp = ans = score0 + score1
              for i in s[1:-1]:
                  if i == "0":
                      tmp +=1
                  else:
                      tmp -=1
                  ans = max(ans,tmp)
              return ans
      

三、总结:

本题考察字符串分割遍历,在该题中最优解中可以使用两个for循环,AC提交记录如下:

image.png

  • 时间复杂度:O(n),n是字符串s的长度
  • 空间复杂度:O(1),没有使用额外空间

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