【字符串】B043_LC_包含所有三種字符的子字符串數目(雙指針)

一、Problem

Given a string s consisting only of characters a, b and c.

Return the number of substrings containing at least one occurrence of all these characters a, b and c.

Input: s = "abcabc"
Output: 10
Explanation: The substrings containing at least one occurrence of the characters 
a, b and c are "abc", "abca", "abcab", "abcabc", "bca", "bcab", "bcabc", "cab", "cabc" and "abc" (again). 

二、Solution

方法一:雙指針

  • 如果窗口 [l, r] 內部的字符 a、b、c 的個數都大於 0,證明子串 s[l:r] 是合法的。
  • 還可以推出此時的子串 s[l:r] 還可以和 r 右邊的所有字符組成合法子串。
class Solution {
    public int numberOfSubstrings(String S) {
        int l = 0, r = 0, n = S.length(), cnt = 0, mp[] = new int[3];
        char[] s = S.toCharArray();

        while (r < n) {
            mp[s[r]-'a']++;
            while (mp[0] >= 1 && mp[1] >= 1 && mp[2] >= 1) {
                cnt += n - r;
                mp[s[l]-'a']--;
                l++;
            }
            r++;
        }
        return cnt;
    }
}

複雜度分析

  • 時間複雜度:O(n)O(n)
  • 空間複雜度:O(1)O(1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章