Leetcode 2949. Count Beautiful Substrings II

  • [Leetcode 2949. Count Beautiful Substrings II](#Leetcode 2949. Count Beautiful Substrings II)
    • [1. 解题思路](#1. 解题思路)
    • [2. 代码实现](#2. 代码实现)

1. 解题思路

这一题真的很丢脸,居然没有搞定,是看了大佬们的思路之后才想明白的,就感觉丢脸丢大了......

这道题讲道理挺简单的,而且相似类型的题目其实以前做过挺多的了,想不通但是为啥没有直接想到思路......

这道题的话如果没有平方整除 k k k的限制,只是要求元音和辅音字符相同的子串的数目,其实问题就非常简单,只要记录一下两者的差值,然后在相同项之间取开始和结束点即可,即 C n 2 C_n^2 Cn2种选择方法。

这里复杂也就是复杂在多了一个平方整除 k k k的限制要求,不过事实上这个也不麻烦的,我们在多一个字符串总长度的counter即可,要使得一个数的平方为 k k k的倍数,那么这个数一个是某一个数 p p p的倍数,且 p p p满足 p p p为最小的使得 p 2 ≡ 0 ( m o d k ) p^2 \equiv 0 (mod\ k) p2≡0(mod k)。

然后,我们重复上面的思路找一下每一种可能性的首尾节点的可能选取方式即可。

2. 代码实现

给出python代码实现如下:

python 复制代码
class Solution:
    def beautifulSubstrings(self, s: str, k: int) -> int:
        p = 1
        for i in range(1, k+1):
            if i * i % k == 0:
                p = i
                break

        cnt = defaultdict(int)
        cnt[(0, 0)] = 1
        delta, num = 0, 0
        for ch in s:
            if ch in "aeiou":
                delta += 1
                num += 1
            else:
                delta -= 1
            
            cnt[(delta, num % p)] += 1

        ans = 0
        for n in cnt.values():
            ans += n * (n-1) // 2
        return ans

提交代码评测得到:耗时196ms,占用内存20.7MB。

相关推荐
Espresso Macchiato11 天前
Leetcode 3352. Count K-Reducible Numbers Less Than N
动态规划·二进制·leetcode hard·leetcode 3352·leetcode周赛423
Espresso Macchiato1 个月前
Leetcode 3321. Find X-Sum of All K-Long Subarrays II
leetcode·滑动窗口·leetcode hard·leetcode 3321·leetcode周赛419
Espresso Macchiato3 个月前
Leetcode 3261. Count Substrings That Satisfy K-Constraint II
滑动窗口·leetcode hard·leetcode周赛411·leetcode 3261·累积数组
Espresso Macchiato3 个月前
Leetcode 3260. Find the Largest Palindrome Divisible by K
leetcode hard·回文·分类讨论·leetcode 3260·leetcode周赛411
Espresso Macchiato4 个月前
Leetcode 3213. Construct String with Minimum Cost
动态规划·leetcode hard·trie树·leetcode 3213·leetcode周赛405
Espresso Macchiato5 个月前
Leetcode 3201. Find the Maximum Length of Valid Subsequence I
leetcode medium·leetcode题解·leetcode 3201·leetcode周赛404
Espresso Macchiato5 个月前
Leetcode 3203. Find Minimum Diameter After Merging Two Trees
leetcode hard·图算法·拓扑图·leetcode 3203·leetcode 周赛404
Espresso Macchiato5 个月前
Leetcode 3193. Count the Number of Inversions
leetcode·动态规划·leetcode hard·leetcode 3193·leetcode双周赛133
Espresso Macchiato5 个月前
Leetcode 3195. Find the Minimum Area to Cover All Ones I
leetcode·leetcode medium·leetcode题解·leetcode 3195·leetcode周赛403
Espresso Macchiato5 个月前
Leetcode 3187. Peaks in Array
leetcode hard·leetcode周赛402·leetcode 3187·segment tree·分段树