博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Longest Substring with At Least K Repeating Characters 至少有K个重复字符的最长子字符串...
阅读量:6682 次
发布时间:2019-06-25

本文共 2169 字,大约阅读时间需要 7 分钟。

Find the length of the longest substring T of a given string (consists of lowercase letters only) such that every character in T appears no less than k times.

Example 1:

Input:s = "aaabb", k = 3Output:3The longest substring is "aaa", as 'a' is repeated 3 times.

Example 2:

Input:s = "ababbc", k = 2Output:5The longest substring is "ababb", as 'a' is repeated 2 times and 'b' is repeated 3 times.

这道题给了我们一个字符串s和一个正整数k,让我们求一个最大子字符串并且每个字符必须至少出现k次。作为LeetCode第三次编程比赛的压轴题目,博主再一次没有做出来,虽然难度标识只是Medium。后来在网上膜拜学习了大神们的解法,发现我当时的没做出来的原因主要是卡在了如何快速的判断某一个字符串是否所有的元素都已经满足了至少出现k次这个条件,虽然我也用哈希表建立了字符和其出现次数之间的映射,但是如果每一次都要遍历哈希表中的所有字符看其出现次数是否大于k,未免有些不高效。而用mask就很好的解决了这个问题,由于字母只有26个,而整型mask有32位,足够用了,每一位代表一个字母,如果为1,表示该字母不够k次,如果为0就表示已经出现了k次,这种思路真是太聪明了,隐约记得这种用法在之前的题目中也用过,但是博主并不能举一反三(沮丧脸:(),还得继续努力啊。我们遍历字符串,对于每一个字符,我们都将其视为起点,然后遍历到末尾,我们增加哈希表中字母的出现次数,如果其小于k,我们将mask的对应位改为1,如果大于等于k,将mask对应位改为0。然后看mask是否为0,是的话就更新res结果,然后把当前满足要求的子字符串的起始位置j保存到max_idx中,等内层循环结束后,将外层循环变量i赋值为max_idx+1,继续循环直至结束,参见代码如下:

解法一:

class Solution {public:    int longestSubstring(string s, int k) {        int res = 0, i = 0, n = s.size();        while (i + k <= n) {            int m[26] = {
0}, mask = 0, max_idx = i; for (int j = i; j < n; ++j) { int t = s[j] - 'a'; ++m[t]; if (m[t] < k) mask |= (1 << t); else mask &= (~(1 << t)); if (mask == 0) { res = max(res, j - i + 1); max_idx = j; } } i = max_idx + 1; } return res; }};

下面这种写法是上面的解法的递归写法,看起来简洁了不少,但是个人感觉比较难想,参见代码如下:

解法二:

class Solution {public:    int longestSubstring(string s, int k) {        int n = s.size(), max_idx = 0, res = 0;        int m[128] = {
0}; bool ok = true; for (char c : s) ++m[c]; for (int i = 0; i < n; ++i) { if (m[s[i]] < k) { res = max(res, longestSubstring(s.substr(max_idx, i - max_idx), k)); ok = false; max_idx = i + 1; } } return ok ? n : max(res, longestSubstring(s.substr(max_idx, n - max_idx), k)); }};

本文转自博客园Grandyang的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
mysql的sql执行计划详解
查看>>
Cacti 0.8.8b 配置spine
查看>>
ppt免费模板下载
查看>>
有关字符串中的函数及其部分面试题
查看>>
试用分区助手心得
查看>>
IP地址被恶意域名解析
查看>>
完美安装centos7编译安装php5.6.40(亲测成功!)
查看>>
CentOS7基于虚拟用户的vsfptd
查看>>
[1]supervisor的使用管理:实现对异常中断的子进程的自动重启(以tomcat为例)
查看>>
关于配置Radius认证服务器的思路与配置方法
查看>>
一张表格让编程语言的选择不再迷茫无措
查看>>
CentOS7.5中安装openoffice
查看>>
马哥运维班第四周作业
查看>>
已解决:无法连接到WMI提供程序。你没有权限或者该服务器无访问···
查看>>
Linux -- logrotate 切割 Nginx
查看>>
Eclipse上安装GIT插件EGit及使用
查看>>
SUSE安装SSH
查看>>
swt定时器的实现 .
查看>>
exchange2010赋予普通用户新建和删除邮箱的权限
查看>>
CRS-0215: Could not start resource 'ora.DB.DB2.inst'
查看>>