当前位置: 代码迷 >> 综合 >> 1525 字符串的好分割数目(字典计数)
  详细解决方案

1525 字符串的好分割数目(字典计数)

热度:3   发布时间:2024-02-26 11:29:54.0

1. 问题描述:

给你一个字符串 s ,一个分割被称为 「好分割」 当它满足:将 s 分割成 2 个字符串 p 和 q ,它们连接起来等于 s 且 p 和 q 中不同字符的数目相同。请你返回 s 中好分割的数目。

示例 1:

输入:s = "aacaba"
输出:2
解释:总共有 5 种分割字符串 "aacaba" 的方法,其中 2 种是好分割。
("a", "acaba") 左边字符串和右边字符串分别包含 1 个和 3 个不同的字符。
("aa", "caba") 左边字符串和右边字符串分别包含 1 个和 3 个不同的字符。
("aac", "aba") 左边字符串和右边字符串分别包含 2 个和 2 个不同的字符。这是一个好分割。
("aaca", "ba") 左边字符串和右边字符串分别包含 2 个和 2 个不同的字符。这是一个好分割。
("aacab", "a") 左边字符串和右边字符串分别包含 3 个和 1 个不同的字符。

示例 2:

输入:s = "abcd"
输出:1
解释:好分割为将字符串分割成 ("ab", "cd") 。

示例 3:

输入:s = "aaaaa"
输出:4
解释:所有分割都是好分割。

示例 4:

输入:s = "acbadbaada"
输出:2

提示:

  • s 只包含小写英文字母。
  • 1 <= s.length <= 10^5

2. 思路分析:

分析题目可以知道我们需要计算[0, i]与[i +1, len(s)]的不同字符的个数,所以这个是一个计数问题,对于计数的相关问题,是可以使用哈希表记录键值对的映射关系进行计数的,也就是将出现相同的键进行计数,java或者c++语言可以使用map进行计数,对于python语言可以使用字典进行计数,只是计数的时候使用的数据结构是不一样的,但是效果是一样的,基于这个想法比较容易想到的是使用两个字典来记录左边与右边出现的字符的数目,所以可以先预处理一下这两个字典dic1与dic2,dic1记录字符串的第一个字符出现的次数,dic2记录字符串中第二个字符到len(s)位置字符的出现的次数,然后从字符串s的第二个位置开始模拟字符串的好分割过程,对于当前的字符c,dic1[c] += 1, dic2[c] -= 1,并且需要注意的是当当前字符c在字典dic2出现的次数为1的时候那么就需要删除掉dic2中的这个键,这样我们才可以根据两个字典的长度判断出不同字符的数目,我们在判断出满足两个字典长度相同的时候对结果进行加1即可

3. 代码如下:

import collectionsclass Solution:def numSplits(self, s: str) -> int:if not s: return 0dic1, dic2 = collections.defaultdict(int), collections.defaultdict(int)dic1[s[0]] += 1for i in range(1, len(s)):dic2[s[i]] += 1res = 0if len(dic1) == len(dic2): res += 1for i in range(1, len(s) - 1):dic1[s[i]] += 1# 当检查当前待删除的字符在dic2中的次数为1的时候应该将dic2中对应的键删除掉这样在统计长度的时候才不会统计进来if dic2[s[i]] == 1: del dic2[s[i]]if len(dic1) == len(dic2): res += 1return res