前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 1520. 最多的不重叠子字符串(贪心)

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

作者头像
Michael阿明
发布2021-02-19 11:30:29
6120
发布2021-02-19 11:30:29
举报
文章被收录于专栏:Michael阿明学习之路

文章目录

1. 题目

给你一个只包含小写字母的字符串 s ,你需要找到 s 中最多数目的非空子字符串,满足如下条件:

  • 这些字符串之间互不重叠,也就是说对于任意两个子字符串 s[i…j] 和 s[k…l] ,要么 j < k 要么 i > l 。
  • 如果一个子字符串包含字符 char ,那么 s 中所有 char 字符都应该在这个子字符串中。

请你找到满足上述条件的最多子字符串数目。如果有多个解法有相同的子字符串数目,请返回这些子字符串总长度最小的一个解。可以证明最小总长度解是唯一的。

请注意,你可以以 任意 顺序返回最优解的子字符串。

代码语言:javascript
复制
示例 1:
输入:s = "adefaddaccc"
输出:["e","f","ccc"]
解释:下面为所有满足第二个条件的子字符串:
[
  "adefaddaccc"
  "adefadda",
  "ef",
  "e",
  "f",
  "ccc",
]
如果我们选择第一个字符串,那么我们无法再选择其他任何字符串,所以答案为 1 。
如果我们选择 "adefadda" ,剩下子字符串中我们只可以选择 "ccc" ,
它是唯一不重叠的子字符串,所以答案为 2 。
同时我们可以发现,选择 "ef" 不是最优的,因为它可以被拆分成 2 个子字符串。
所以最优解是选择 ["e","f","ccc"] ,答案为 3 。
不存在别的相同数目子字符串解。

示例 2:
输入:s = "abbaccd"
输出:["d","bb","cc"]
解释:注意到解 ["d","abba","cc"] 答案也为 3 ,但它不是最优解,因为它的总长度更长。
 
提示:
1 <= s.length <= 10^5
s 只包含小写英文字母。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-number-of-non-overlapping-substrings 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
class Solution {
public:
    vector<string> maxNumOfSubstrings(string s) {
    	vector<int> start(26,-1), end(26,-1);
    	int i = 0, n = s.size(), l, r, last = -1;
    	for(i = 0; i < n; ++i)
    	{
    		char ch = s[i];
    		if(start[ch-'a'] == -1)
    			start[ch-'a'] = i;
    		end[ch-'a'] = i;
    	}
    	vector<int> endpos;
    	for(auto e : end)
    		if(e != -1)
    			endpos.push_back(e);
    	sort(endpos.begin(), endpos.end());
    	vector<string> ans;
    	for(auto e : endpos)
    	{
    		l = start[s[e]-'a'];
    		r = e;
    		while(l < r)
    		{
    			if(end[s[r]-'a'] > e || l <= last)
    				break;
    			l = min(l, start[s[r]-'a']);
    			r--;
    		}
    		if(r == l)
    		{
                ans.push_back(s.substr(l, e-l+1));
                last = e;
            }
    	}
    	return ans;
    }
};

184 ms 20 MB

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/08/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档