首页 > 其他分享 >LeetCode 2950. 可整除子串的数量

LeetCode 2950. 可整除子串的数量

时间:2024-07-11 23:56:15浏览次数:19  
标签:子串 word presum ans 字符串 整除 2950 LeetCode

2950. 可整除子串的数量

每个英文字母都被映射到一个数字,如下所示。

如果字符串的字符的映射值的总和可以被字符串的长度整除,则该字符串是 可整除 的。

给定一个字符串 s,请返回 s 的 可整除子串 的数量

子串 是字符串内的一个连续的非空字符序列。

示例 1:

SubstringMappedSumLengthDivisible?
a111Yes
s771Yes
d221Yes
f331Yes
as1, 782Yes
sd7, 292No
df2, 352No
asd1, 7, 2103No
sdf7, 2, 3123Yes
asdf1, 7, 2, 3134No
输入:word = "asdf"
输出:6
解释:上表包含了有关 word 中每个子串的详细信息,我们可以看到其中有 6 个是可整除的。

示例 2:

输入:word = "bdh"
输出:4
解释:4 个可整除的子串是:"b","d","h","bdh"。
可以证明 word 中没有其他可整除的子串。

示例 3:

输入:word = "abcd"
输出:6
解释:6 个可整除的子串是:"a","b","c","d","ab","cd"。
可以证明 word 中没有其他可整除的子串。

提示:

  • 1 <= word.length <= 2000
  • word 仅包含小写英文字母。

提示 1

Iterate over all substrings in O(n * n).


提示 2

For each substring, try to calculate the sum of the mapped values in O(1).


提示 3

To do the above, use a partial sum array.

解法1: 前缀和 + 哈希表

对于0 <= i < j < n,  presum[i] = sum( nums[0...i]) ,  presum[j] = sum( nums[0...j] ), 

presum[j] - presum[i] = sum( nums[i + 1...j]);

对于0 <= i < j < n,  ( presum[j] - presum[i] ) % (j - i) == 0,我们枚举 j ,找到符合要求的 i 的个数,然后累加到答案上。  

Java版:

class Solution {
    public int countDivisibleSubstrings(String word) {
        int ans = 0;
        int presum = 0;
        Map<Integer, Integer> map = new HashMap<>();
        map.put(0, -1);
        for (int i = 0; i < word.length(); i++) {
            Character c = word.charAt(i);
            presum += (c - 'a' + 1) / 3 + 1;
            for (Map.Entry<Integer,Integer> entry : map.entrySet()) {
                if ( (presum - entry.getKey()) % (i - entry.getValue()) == 0 ) {
                    ans++;
                }
            }
            
            map.put(presum, i);
        }
        return ans++;
    }

}

Python3版:

class Solution:
    def countDivisibleSubstrings(self, word: str) -> int:
        ans = 0
        dic = {0: -1}
        presum = 0 
        for i, c in enumerate(word):
            val = (ord(c) - ord('a') + 1) // 3 + 1
            presum += val 
            for k, v in dic.items():
                if (presum - k) % (i - v) == 0:
                    ans += 1

            dic[presum] = i
        return ans

复杂度分析

  • 时间复杂度: O(n),其中 n 为字符串 word 的长度。
  • 空间复杂度: O(n),其中 n 为字符串 word 的长度。哈希表的空间开销为 n 。

标签:子串,word,presum,ans,字符串,整除,2950,LeetCode
From: https://blog.csdn.net/m0_56090828/article/details/140364518

相关文章

  • 代码随想录算法训练营第六天 | Python | LeetCode242.有效的字母异位词、LeetCode349.
    哈希表理论https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html一般哈希表都是用来快速判断一个元素是否出现集合里。数组/set/mapLeetCode242.有效的字母异位词题目链接:https://leetcode.cn/problems/valid-anagr......
  • 代码随想录算法训练营第四天 | Python | LeetCode24.两两交换链表中的节点、19.删除链
    LeetCode24.两两交换链表中的节点题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/description/文章/视频链接:https://programmercarl.com/0024.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.html#%E7%AE%9......
  • 【完结】LeetCode 热题 HOT 100分类+题解+代码详尽指南
    目录LeetCode热题100前言LeetcodeTop100题目和答案-哈希LeetcodeTop100题目和答案-双指针篇LeetcodeTop100题目和答案-滑动窗口篇LeetcodeTop100题目和答案-子串篇LeetcodeTop100题目和答案-普通数组篇LeetcodeTop100题目和答案-矩阵篇LeetcodeTop100题目和......
  • LeetCode --- 2103. Rings and Rods 解题报告
    Question:Thereare n ringsandeachringiseitherred,green,orblue.Theringsaredistributed acrosstenrods labeledfrom 0 to 9.Youaregivenastring rings oflength 2n thatdescribesthe n ringsthatareplacedontotherods.Everyt......
  • 「字符串」Manacher算法(马拉车)/ LeetCode 05(C++)
    给你一个字符串 s,找到 s 中最长的回文子串。示例1:输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答案。示例2:输入:s="cbbd"输出:"bb"思路我们回想中心扩散法:某字符处的中心扩散完毕后,其实已经将它身前身后的字符段落都搜索过了,那么如果我们搜索其后的字......
  • leetcode||707.双向链表
    1.思路:设置虚拟头节点和虚拟尾节点2.为了提高查询效率,在根据索引查找节点的值时注意头尾虚拟节点的选择。java代码publicclassDoubleList707{//1.双向链表的结构privateclassListNode{intvalue;ListNodepre;ListNodenext;......
  • leetcode 704.二分查找
    重点区分:while(left<right) 和 while(left<=right)right=middle和right=middle-1当处于左闭右闭区间内时,while(left<=right)当处于左闭右开区间时,while(left<right)right=middle和right=middle-1,以此类推1.原理(来源代码随想录)(1)第一种情况(2)第二......
  • 菜鸟的Leetcode(02)
    系列文章目录第1章 求和第2章 回文文章目录系列文章目录前言一、题目二、知识点三、解题步骤1.思路2.实现3.演示4.其他总结一、题目给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数......
  • LeetCode 面试题 17.05. 字母与数字
    面试题17.05.字母与数字给定一个放有字母和数字的数组,找到最长的子数组,且包含的字母和数字的个数相同。返回该子数组,若存在多个最长子数组,返回左端点下标值最小的子数组。若不存在这样的数组,返回一个空数组。示例1:输入:["A","1","B","C","D","2","3","4","E","5&q......
  • LeetCode 1546. 和为目标值且不重叠的非空子数组的最大数目
    1546.和为目标值且不重叠的非空子数组的最大数目给你一个数组 nums 和一个整数 target 。请你返回 非空不重叠 子数组的最大数目,且每个子数组中数字和都为 target 。示例1:输入:nums=[1,1,1,1,1],target=2输出:2解释:总共有2个不重叠子数组(加粗数字表示)[1,......