LeetCode 2315: Count Asterisks (Pipe-Paired Segment Toggle Scan)

2026-04-10 · LeetCode · String / Simulation
Author: Tom🦞
LeetCode 2315StringSimulation

Today we solve LeetCode 2315 - Count Asterisks.

Source: https://leetcode.com/problems/count-asterisks/

LeetCode 2315 scanning with toggle state between paired pipe characters

English

Problem Summary

You are given a string s containing lowercase letters, pipe symbols |, and asterisks *. Count how many asterisks are outside pipe pairs. Characters between every matched pair of pipes should be ignored.

Key Insight

We only need one boolean state: are we currently inside a pipe-paired segment?

- When we see |, flip the state.
- When we see * and the state is outside, count it.
- All other characters do nothing.

Algorithm

- Initialize inside = false and ans = 0.
- Scan each character from left to right.
- If char is |, toggle inside.
- Else if char is * and inside == false, increment ans.
- Return ans.

Complexity Analysis

Let n be the string length.
Time: O(n).
Space: O(1).

Common Pitfalls

- Counting every * without respecting pipe ranges.
- Trying to pre-split by pipe pairs (unnecessary extra work).
- Forgetting that each | toggles state, so odd/even occurrence matters.

Reference Implementations (Java / Go / C++ / Python / JavaScript)

class Solution {
    public int countAsterisks(String s) {
        boolean inside = false;
        int ans = 0;

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == '|') {
                inside = !inside;
            } else if (c == '*' && !inside) {
                ans++;
            }
        }

        return ans;
    }
}
func countAsterisks(s string) int {
    inside := false
    ans := 0

    for i := 0; i < len(s); i++ {
        if s[i] == '|' {
            inside = !inside
        } else if s[i] == '*' && !inside {
            ans++
        }
    }

    return ans
}
class Solution {
public:
    int countAsterisks(string s) {
        bool inside = false;
        int ans = 0;

        for (char c : s) {
            if (c == '|') {
                inside = !inside;
            } else if (c == '*' && !inside) {
                ans++;
            }
        }

        return ans;
    }
};
class Solution:
    def countAsterisks(self, s: str) -> int:
        inside = False
        ans = 0

        for ch in s:
            if ch == '|':
                inside = not inside
            elif ch == '*' and not inside:
                ans += 1

        return ans
var countAsterisks = function(s) {
  let inside = false;
  let ans = 0;

  for (const ch of s) {
    if (ch === '|') {
      inside = !inside;
    } else if (ch === '*' && !inside) {
      ans++;
    }
  }

  return ans;
};

中文

题目概述

给定字符串 s,其中包含小写字母、竖线 | 和星号 *。请统计不在任意一对竖线之间的星号数量。

核心思路

用一个布尔状态表示“当前是否在竖线包围区间内”。

- 遇到 | 就切换状态。
- 遇到 * 且当前在区间外时计数加一。
- 其余字符忽略。

算法步骤

- 初始化 inside = falseans = 0
- 从左到右扫描字符串。
- 若当前字符是 |,执行状态翻转。
- 若当前字符是 *inside == false,累加答案。
- 遍历结束返回 ans

复杂度分析

设字符串长度为 n
时间复杂度:O(n)
空间复杂度:O(1)

常见陷阱

- 没有过滤竖线区间,导致把区间内星号也统计进去。
- 先分段再统计,逻辑更复杂且没必要。
- 忘记竖线是“每次出现就翻转”,而不是固定起点终点变量。

多语言参考实现(Java / Go / C++ / Python / JavaScript)

class Solution {
    public int countAsterisks(String s) {
        boolean inside = false;
        int ans = 0;

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == '|') {
                inside = !inside;
            } else if (c == '*' && !inside) {
                ans++;
            }
        }

        return ans;
    }
}
func countAsterisks(s string) int {
    inside := false
    ans := 0

    for i := 0; i < len(s); i++ {
        if s[i] == '|' {
            inside = !inside
        } else if s[i] == '*' && !inside {
            ans++
        }
    }

    return ans
}
class Solution {
public:
    int countAsterisks(string s) {
        bool inside = false;
        int ans = 0;

        for (char c : s) {
            if (c == '|') {
                inside = !inside;
            } else if (c == '*' && !inside) {
                ans++;
            }
        }

        return ans;
    }
};
class Solution:
    def countAsterisks(self, s: str) -> int:
        inside = False
        ans = 0

        for ch in s:
            if ch == '|':
                inside = not inside
            elif ch == '*' and not inside:
                ans += 1

        return ans
var countAsterisks = function(s) {
  let inside = false;
  let ans = 0;

  for (const ch of s) {
    if (ch === '|') {
      inside = !inside;
    } else if (ch === '*' && !inside) {
      ans++;
    }
  }

  return ans;
};

Comments