统计星号

标签: 字符串

难度: Easy

给你一个字符串 s ,每 两个 连续竖线 '|' 为 一对 。换言之,第一个和第二个 '|' 为一对,第三个和第四个 '|' 为一对,以此类推。

请你返回 不在 竖线对之间,s 中 '*' 的数目。

注意,每个竖线 '|' 都会 恰好 属于一个对。

示例 1:

输入:s = "l|*e*et|c**o|*de|"
输出:2
解释:不在竖线对之间的字符加粗加斜体后,得到字符串:"l|*e*et|c**o|*de|" 。
第一和第二条竖线 '|' 之间的字符不计入答案。
同时,第三条和第四条竖线 '|' 之间的字符也不计入答案。
不在竖线对之间总共有 2 个星号,所以我们返回 2 。

示例 2:

输入:s = "iamprogrammer"
输出:0
解释:在这个例子中,s 中没有星号。所以返回 0 。

示例 3:

输入:s = "yo|uar|e**|b|e***au|tifu|l"
输出:5
解释:需要考虑的字符加粗加斜体后:"yo|uar|e**|b|e***au|tifu|l" 。不在竖线对之间总共有 5 个星号。所以我们返回 5 。

提示:

  • 1 <= s.length <= 1000
  • s 只包含小写英文字母,竖线 '|' 和星号 '*' 。
  • s 包含 偶数 个竖线 '|'

Submission

运行时间: 23 ms

内存: 16.0 MB

class Solution:
    def countAsterisks(self, s: str) -> int:
        ans = 0
        if '|' not in s:
            if '*' not in s:
                return 0
            else:
                return s.count('*')
        else:
            a = s.split('|')
            for i in range(0,len(a),2):
                if '*' in a[i]:
                    ans += a[i].count('*')
            return ans

Explain

此题解的思路基于对字符串s的分割处理。首先,使用'|'作为分隔符对字符串s进行分割,得到一个数组a,其中数组的每个元素是竖线'|'之间的字符串。根据题目要求,每两个竖线'|'为一对,因此数组a中,索引为偶数的元素(0, 2, 4, ...)是不在竖线对之间的部分。接着,遍历数组a的偶数索引位置的元素,统计每个元素中星号'*'的数量,并累加到最终结果ans中。最后返回累加的结果ans。

时间复杂度: O(n)

空间复杂度: O(n)

class Solution:
    def countAsterisks(self, s: str) -> int:
        ans = 0
        # 如果字符串中没有'|',直接返回所有的'*'的数量
        if '|' not in s:
            return s.count('*')
        # 使用'|'分割字符串,并处理每一部分
        else:
            a = s.split('|')
            # 遍历分割后的数组,只考虑偶数索引的部分,因为它们不在'|'对内
            for i in range(0, len(a), 2):
                ans += a[i].count('*')
            return ans

Explore

如果字符串s以'|'开头或结尾,或者包含连续的'|',使用split('|')方法后会在数组a中生成空字符串。例如,s='|*|'会被分割为['', '*', '']。在这种情况下,空字符串的偶数索引位置(例如0和2)仍然会被遍历,但由于它们是空的,所以其中的星号数量为0。因此,这种情况下的处理不会影响星号的统计结果。

如果'|'的数量是奇数,split('|')方法仍然会按'|'分割字符串。然而,数组a中最后一个元素将是最后一个'|'之后的部分,不属于任何'|'对。根据题解逻辑,我们遍历偶数索引位置的元素,这包括了最后一个元素(如果数组长度是奇数的话)。因此,尽管'|'是奇数,解决方案仍然能正确地统计出不在'|'对之间的星号。

如果字符串中没有'|',那么整个字符串可以视为一个不被'|'对影响的部分。因此,直接统计并返回所有星号是正确的处理方式。这种做法考虑了没有'|'的情况,是有效且准确的。

根据题目的要求,需要统计的是不在'|'对之间的星号。在split('|')后,偶数索引位置的元素(0, 2, 4, ...)代表的是不在任何'|'对之间的字符串片段,而奇数索引位置的元素则处于'|'对之间。因此,为了满足题目要求,只统计偶数索引位置的星号,并忽略奇数索引位置的星号。