leetcode1525. 字符串的好分割数目

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

请你返回 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

方法:哈希集合

思路:

本题可以直接使用模拟来解决。

我们可以知道,长度为n的字符串,可以有n-1种分割方式。

我们从头开始遍历,使用一个集合(哈希表)word来保存目前遍历到的字符串中存在的字符(集合会将重复的字符过滤)。

使用一个长度为n的数组begin,begin[i]表示s[:i+1]子串中存在的不同字符数(即集合word此时的长度)

然后我们将word集合清空,从s的最后往前遍历,直到s[1](因为遍历到s[0]的话,右侧字符串为s,左侧字符串不存在,不符合题意),加入遍历到字符s[i],那么此时word的长度即为s[i:]子串中的不同字符数。此时如果len(word) = begin[i-1],那么即是一种好分割。

统计所有的好分割数,返回即可。

  • 遍历了两次,而对集合求长度的时间复杂度为O(1),所以总的时间复杂度为O(2n),渐进时间复杂度为O(n)。
  • 使用了一个集合和数组,空间复杂度为O(n)。

代码:

Python3:

class Solution:def numSplits(self, s: str) -> int:res = 0n = len(s)# begin[i]存放s[:i+1]中不同字符的数量begin = [0 for _ in range(n)]word = set()for i in range(n):word.add(s[i])begin[i] = len(word)word.clear()# 下面开始从后往前遍历,统计右半部分的情况,i的时候,len(word)即s[i:]的不同字符数# 与之相匹配的即为begin[i-1],如果两者相等,则为好分割。for i in range(n-1,0,-1):word.add(s[i])if begin[i-1] == len(word):res += 1return res

cpp:

class Solution {public:int numSplits(string s) {int res = 0;int n = s.size();// begin[i]存放s[:i+1]中不同字符的数量auto begin = vector<int>(n,0);unordered_set<char> word;for (int i = 0; i < n-1; ++i){word.insert(s[i]);begin[i] = word.size();}word.clear();// 下面开始从后往前遍历,统计右半部分的情况,i的时候,len(word)即s[i:]的不同字符数// 与之相匹配的即为begin[i-1],如果两者相等,则为好分割。for (int i=n-1 ; i > 0; --i){word.insert(s[i]);if (begin[i-1] == word.size()) res += 1;}return res;}
};

结果:

c字符串分割成数组_leetcode第31双周赛第三题leetcode1525. 字符串的好分割数目相关推荐

  1. [leetcode 10-4] 三、分割数组最多方案(双周赛第四题)

    class Solution:def waysToPartition(self, nums: List[int], k: int) -> int:# 同时给你一个整数 k .你可以将 nums ...

  2. oracle 分割字符成数组,oracle依据分隔符将字符串分割成数组函数

    oracle根据分隔符将字符串分割成数组函数 --创建表类型 create or replace type mytype as table of number; --如果定义成varchar --CR ...

  3. PHP中怎么把字符串分割成数组?

    经常会遇到要把字符串分割成数组的情况,在Java中只要调用split(",")方法就能把字符串分割成数组,在JS中也很简单同样也是调用split( "," )方 ...

  4. PHP根据逗号分割,将字符串转成数组

    PHP根据逗号分割,将字符串转成数组 <?php$str = '电气鼠,蒹葭苍苍,小飞鱼,奶片';// 根据逗号分割,将字符串转成数组$array = explode(',', $str);ec ...

  5. 分割成数组php字符串函数,PHP 分割字符串函数把字符串分割成数组示例

    这篇文章主要为大家详细介绍了PHP 分割字符串函数把字符串分割成数组示例,具有一定的参考价值,可以用来参考一下. 对PHP分割字符串函数把字符串分割成数组感兴趣的小伙伴,下面一起跟随512笔记的小编两 ...

  6. oracle 字符串分割成数组_oracle根据分隔符将字符串分割成数组函数

    --创建表类型 create or replace type mytype as table of number; --如果定义成varchar --CREATE OR REPLACE type my ...

  7. 把一个字符串分割成数组 php_PHP怎么将字符串拆分成数组

    在日常项目开发过程中,较长的字符串可能需要被拆分成数组形式,以便被展现或用于判断验证.那么将字符串拆分成数组,也很容易实现,我们可以直接通过PHP中的explode函数来进行拆分. 下面我们就通过简单 ...

  8. 前端JS数组问题: 数组去重, 字符串分割成数组, 数组拼接成字符串

    1. 数组去重: Array.from(new Set(arr_name)) let arr1 = ['张三','李四','王五','李四','赵六','张三'];let arr2 = Array.f ...

  9. php把字符串指定字符分割成数组

    <?php $str="1|2|3|4|5|"; $var=explode("|",$str); print_r($var); ?> $var=ex ...

最新文章

  1. Basic local alignment search tool (BLAST)
  2. 9个数据科学中常见距离度量总结以及优缺点概述
  3. Elasticsearch 与 Kafka 整合剖析
  4. log nginx 客户端请求大小_nginx
  5. 锁、C#中Monitor和Lock以及区别
  6. 点击之后从浏览器回到微信界面的方法
  7. mysql中文问号 linux,解决Linux系统下Mysql数据库中文显示成问号的问题
  8. Python正则表达式简单说明(菜鸟教程里面的说明)
  9. Python学习笔记-异常处理
  10. 想加入一行代码吗?使用code标签
  11. 在Asp.net中弹出对话框,确定后跳转到其他页面
  12. 微信客户管理SCRM系统SDK
  13. ble mesh 学习笔记(9)telink的mesh-lpn代码分析
  14. HDU 1155 Bungee Jumping(物理题,动能公式,弹性势能公式,重力势能公式)
  15. 2021cka考试标准答案
  16. Android 布局旋转 横屏竖屏
  17. 关于Java中的锁,看这一篇就够了(总结篇)
  18. import traceback
  19. 银联API | 银行卡信息查询 信息安全获取
  20. 大咖分享|姚秀清:数据资产管理平台如何建设?

热门文章

  1. c++学习笔记之友元函数
  2. 机器学习导论(张志华):核定义(2)
  3. Matlab画图小结(二)
  4. Git学习笔记:远程仓库
  5. 关于Linux的缓存内存 Cache Memory详解
  6. Ubuntu安装screen
  7. [云炬创业学笔记]第二章决定成为创业者测试14
  8. [云炬创业管理笔记]第三章测试1
  9. [NTU-Machine-learning-note]1 Introduction(3)
  10. 科大星云诗社动态20210806