原题链接:https://leetcode-cn.com/problems/maximum-number-of-non-overlapping-substrings/

贪心算法:

  1. 找出26个字符为首尾的最长子串左右边界的位置
  2. 写extend函数–求出以位置i为左边界的最长合法子串,并返回右边界
  3. 循环遍历字符串,并调用extend函数,将最长合法子串先加入ans,然后再判断最长合法子串是否可以分解为更小的子串。

例子:
如s=“adefaddaccc”

  • a的最长子串为adefadda
  • c的最长子串为ccc
  • d的最长子串为adefadda
  • e的最长子串为e
  • f的最长子串为f

对ans数组:

  • 加入adefadda
  • 覆盖为e
  • 添加“”,并覆盖为f
  • 添加“”,并覆盖为ccc

代码:

vector<string> maxNumOfSubstrings(string s) {const int n=s.size();vector<int> l(26,INT_MAX);vector<int> r(26,INT_MIN);//找出所有字符最左边的和最右边的位置for(int i=0;i<n;i++){l[s[i]-'a']=min(l[s[i]-'a'],i);//最左边的位置r[s[i]-'a']=max(r[s[i]-'a'],i);//最右边的位置}//找出最长子串auto extend=[&](int i)->int{int p=r[s[i]-'a'];for(int j=i;j<=p;j++){if(l[s[j]-'a']<i) return -1;//如果i不是第一个,则返回-1if(r[s[j]-'a']>p) p=r[s[j]-'a'];//如果以i为首的子串边界超出,则延长边界}return p;};//遍历输出最后结果vector<string> ans;int last=-1;//上一次更新的边界for(int i=0;i<n;i++){int p=extend(i);if(p==-1) continue;//如果i不是第一个该字符,则跳过,只判断i是第一个该字符的情况if(i>last) ans.push_back("");//如果i大于上一次更新的边界,那么说明是新的子串,则添加ans.back()=s.substr(i,p-i+1);//如果i不大于上一次更新的边界,则说明是上个子串内部的子串,覆盖;如果i大于上一次更新的边界,则说明是新的子串,因为上一句插入了空串,此时相当于添加。last=p;//更新右边界}return ans;}

leetcode算法题--最多的不重叠子字符串★★相关推荐

  1. LeetCode 1520. 最多的不重叠子字符串(贪心)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个只包含小写字母的字符串 s ,你需要找到 s 中最多数目的非空子字符串,满足如下条件: 这些字符串之间互不重叠,也就是说对于任意两个子字符串 s[ ...

  2. C#LeetCode刷题之#459-重复的子字符串(Repeated Substring Pattern)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3945 访问. 给定一个非空的字符串,判断它是否可以由它的一个子串 ...

  3. python【力扣LeetCode算法题库】836- 矩形重叠

    矩形重叠 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标. 如果相交的面积为正,则称两矩形重叠.需要明确的是,只在角 ...

  4. LeetCode算法题12:递归和回溯-字符串中的回溯问题

    文章目录 一.电话号码的字母组合 回溯 : 二.括号生成 回溯 : 总结 关于回溯和递归 括号生成的递归描述 : 电话号码的字母组合的递归描述 : 括号生成的BFS描述 : 一.电话号码的字母组合 题 ...

  5. 【Day24】 LeetCode算法题 (注释详细+解题思路)[43. 字符串相乘 ] [1800. 最大升序子数组和]

    刷题打卡,第 二十四 天 题目一.43. 字符串相乘 题目二.1800. 最大升序子数组和 题目一.43. 字符串相乘 原题链接:43. 字符串相乘 题目描述: 给定两个以字符串形式表示的非负整数 n ...

  6. LeetCode算法题整理(200题左右)

    目录 前言 一.树(17) 1.1.后序遍历 1.2.层次遍历 1.3.中序 1.4.前序 二.回溯(20) 2.1.普通回溯 2.2.线性回溯:组合.排列.子集.分割 2.3.矩阵回溯 三.二分查找 ...

  7. LeetCode算法题-Valid Palindrome II(Java实现)

    这是悦乐书的第287次更新,第304篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第155题(顺位题号是680).给定非空字符串s,最多可以删除一个字符. 判断它是否是回 ...

  8. LeetCode算法题-Minimum Depth of Binary Tree(Java实现)

    这是悦乐书的第168次更新,第170篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第27题(顺位题号是111).给定二叉树,找到它的最小深度.最小深度是沿从根节点到最近的 ...

  9. LeetCode算法题-Repeated String Match(Java实现)

    这是悦乐书的第289次更新,第307篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第156题(顺位题号是686).给定两个字符串A和B,找到A必须重复的最小次数,使得B是 ...

最新文章

  1. Docker 常用命令 (持续更新)
  2. C++ 汇编代码查看
  3. Git之删除本地和远程项目
  4. Oracle 检索数据
  5. PSO求解梯级水库优化调度
  6. 洛谷 P1217 [USACO1.5]回文质数 Prime Palindrome
  7. 学Java好还是学Python好?这里有些建议
  8. JavaScript中的运算符和语句
  9. youleb多风格响应式博客wordpress主题模板
  10. 【Linux】scp IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
  11. centos配置kdump捕获内核崩溃
  12. 42Exchange 2010升级到Exchange 2013-证书申请配置
  13. TCPIP详解学习笔记-UDP协议
  14. 机械振动的傅里叶变化分析技术
  15. realtek是什么意思_Realtek高清晰音频管理器 全解析
  16. 计算机软件工作室起名'',半永久工作室名字大全
  17. 位,字节,字,字长的区别是什么?
  18. CABAC整体讲解1
  19. OPPO K7X手机刷root 获取magisk 强解锁BL coloros11教程
  20. java的tey语句return了_谈谈Java中try-catch-finally中的return语句

热门文章

  1. python有什么作用-大数据学习之python语言有什么作用?
  2. python资料下载-python电子书学习资料打包分享百度云资源下载
  3. 学python可以做什么职业好-业余学Python能做什么?对职业发展有什么帮助?
  4. 网页爬虫 python-python爬虫——爬取网页的中文
  5. python3.5安装教程-Python 3.5安装教程
  6. 自学python需要买书吗-请问自学 Python 有必要买课程吗?
  7. python免费试听-小栈春季编程免费试听课 倒数6天!
  8. redis中的intset
  9. LeetCode UTF-8 Validation
  10. LeetCode Integer to English Words(整数转化为英文字母)