热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

1525字符串的好分割数目(字典计数、动态规划)

1.问题描述:给你一个字符串s,一个分割被称为「好分割」当它满足:将s分割成2个字符串p和q,它们连接起来等于s且p和q中

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 <&#61; s.length <&#61; 10^5

2. 思路分析&#xff1a;

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

② 所以我们两遍遍历字符串 &#43; 两个字典来长度检查不同字符的数目

③ 除了上面的这个解法之外&#xff0c;力扣官方提供了一个动态规划的解法&#xff0c;我感觉这个思路也是蛮好的&#xff0c;容易理解&#xff0c;可以学习学习&#xff0c;我的理解如下&#xff1a;它是有一种递推的思想在里面&#xff0c;这个其实也是动态规划能够解决的问题的一个特点&#xff0c;首先声明两个长度为26的列表&#xff08;相当于是字典&#xff09;对出现过的字母进行标记&#xff08;这样也是为了后面的的计数方便&#xff09;&#xff0c;我们在遍历字符串的过程中由前一个位置不同字符出现的次数推出当前这个位置不同字符出现的次数&#xff0c;可以先判断当前字符在字母表中对应的位置是否出现过&#xff0c;如果未出现过那么在上一个位置的不同字符出现的次数进行加1即可&#xff0c;假如出现过那么维持上一个的不同字符出现的次数&#xff0c;这样一遍遍历字符串s就可以知道从0到字符串末尾的位置上不同字符出现的次数&#xff0c;因为是比较左右两边的情况&#xff0c;所以自然想到从末尾的位置开始以同样的方法记录不同字符出现的次数&#xff0c;这样两次遍历之后才可以比较左右两边的不同字符串的次数

3. 代码如下&#xff1a;

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

官方动态规划代码&#xff1a;

class Solution:def numSplits(self, s: str) -> int:n &#61; len(s)left, right &#61; [0] * (n &#43; 2), [0] * (n &#43; 2)rec_left &#61; [False] * 26rec_right &#61; [False] * 26for i in range(1, n &#43; 1):c &#61; ord(s[i - 1]) - ord("a")if rec_left[c]:left[i] &#61; left[i - 1]else:rec_left[c] &#61; Trueleft[i] &#61; left[i - 1] &#43; 1for i in range(n, 0, -1):c &#61; ord(s[i - 1]) - ord("a")if (rec_right[c]):right[i] &#61; right[i &#43; 1]else:rec_right[c] &#61; Trueright[i] &#61; right[i &#43; 1] &#43; 1ret &#61; sum(1 for i in range(1, n) if left[i] &#61;&#61; right[i &#43; 1])return ret

 


推荐阅读
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • java drools5_Java Drools5.1 规则流基础【示例】(中)
    五、规则文件及规则流EduInfoRule.drl:packagemyrules;importsample.Employ;ruleBachelorruleflow-group ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • 本文介绍了一个Python函数same_set,用于判断两个相等长度的数组是否包含相同的元素。函数会忽略元素的顺序和重复次数,如果两个数组包含相同的元素,则返回1,否则返回0。文章还提供了函数的具体实现代码和样例输入输出。 ... [详细]
author-avatar
手机用户2502886253
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有