一、解题背景:

  字符串的子串应该是常见的一类有关字符串的算法题目,这里我将leetcode的相关几道题汇总了一下,写了一些具体的思路和多种的求解方法。

二、问题求解:

3. 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
/***********************************************************************/
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

class Solution {public:// 方法1:int lengthOfLongestSubstring1(string s) {unordered_map<char,int> mp; // 记录的是索引位置int ans = 0, i = 0;for (int j=0; j<s.size(); j++) {if (mp.find(s[j])!=mp.end()) {i = max(mp[s[j]], i);}ans = max(ans, j-i+1);mp[s[j]] = j+1; // 保存对应字符后边的位置索引,可能作为下一次无重复字符串起点}return ans;}// 方法2:int lengthOfLongestSubstring1(string s) {unordered_map<char,int> mp; // 记录的是字符出现的次数int ans = 0;for (int i=0, j=0; j<s.size(); j++) {mp[s[j]]++;while (mp[s[j]]>1) { // 同样这个步骤也是为了找到相同字符的后一个位置mp[s[i++]]--;}ans = max(ans, j-i+1);}return ans;}
};

159. 至多包含两个不同字符的最长子串

给定字符串 s,判断最长的只含有一个或者两个字符的子串的长度。
input_str = “kkkk”
answer = 4
解释:最长子串是 kkkk。
/***********************************************************************/
input_str = “abdyd”
answer = 3
解释:满足条件的最长子串是 dyd。

class Solution {public:bool cmp(const pair<char, int> left,const pair<char, int> right) {return left.second<right.second;}int lengthOfLongest2DisSubstring(string s) {int ans = 1;unordered_map<char, int> mp;for (int j=0, i=0; j<s.size();j++) {mp[s[j]] = j;if(mp.size()==3) {auto iter = min_element(mp.begin(), mp.end(), cmp); // 找到最小的value的键值对i = iter->second+1;mp.erase(iter);}ans = max(ans, j-i+1);}return ans;}
};

395. 至少有 K 个重复字符的最长子串

给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k 。返回这一子串的长度。
实例1:
输入:s = “aaabb”, k = 3
输出:3
解释:最长子串为 “aaa” ,其中 ‘a’ 重复了 3 次。
实例2:
输入:s = “ababbc”, k = 2
输出:5
解释:最长子串为 “ababb” ,其中 ‘a’ 重复了 2 次, ‘b’ 重复了 3 次。

class Solution {public:// 这里主要采用了分治的策略,从而使得问题拆分小,这里的核心是将整个字符串中次数未超过k次的作为分隔符来进行计算出现次数至少k次的最长子串。int dfs(string &s, int l, int r, int k, int res=0) {if (l>r) return 0;unordered_map<char,int> mp;for (int i=l; i<=r; i++)mp[s[i]]++;vector<int> pos;pos.push_back(l-1);for (int i=l; i<=r; i++)if (mp[s[i]]<k) pos.push_back(i);pos.push_back(r+1);if (pos.size()==2) return r-l+1;for (int i=0; i<pos.size()-1; i++) {res = max(res, dfs(s, pos[i]+1, pos[i+1]-1, k, res));}return res;}int longestSubstring(string s, int k) {if (s.size()==0 || s.size()<k) return 0;if (k<=1) return s.size();return dfs(s,0,s.size()-1,k,0);}
};

参考的思路:来源leetcode题解

//分治:对于一个字符串来说,如果要求子串最少出现k次,那么如果某些字母出现的次数小于k,
//这些字母一定不会出现在最长的子串中,并且这些字母将整个字符子串分割成小段,这些小段有可能是最长的
//但是由于被分割了,还是要检查这一小段,如果某些字母出现的次数小于k,会将小段继续分割下去,
//比如字符串"aacbbbdc",要求最少出现2次,我们记录左右闭区间,,
//第一轮[0,7],处理"aacbbbdc",d只出现了一次不满足,于是递归解决区间[0,5]、[7,7]
//第二轮[0,5],处理"aacbbb",  c只出现了一次不满足,于是递归解决区间[0,1]、[3,4]
//第二轮[7,7],处理"c",       c只出现了一次不满足,不继续递归
//第三轮[0,1],处理"aa",      满足出现次数>=2,res=2
//第三轮[3,4],处理"bbb",     满足出现次数>=2 res=3;

【C++】字符串子串的系列问题相关推荐

  1. substr()函数——mysql:截取字符串子串

    substr()函数:截取字符串子串 1.substr(str,pos); SELECT SUBSTR('2018-08-17',6); 2.substr(str from pos); SELECT ...

  2. python 字符串子串_Python字符串子字符串

    python 字符串子串 A substring is the part of a string. Python string provides various methods to create a ...

  3. 【ForOffer】【深信服--测试开发岗笔试题】求最少车费求最低位找马甲找字符串子串

    深信服的整体笔试题难度一般,有多刷题的经验,能立马找出了题意理解,在此,自己只是做个总结发出,有更好的解法的童靴可以一起交流,其实这四道题都是常见题型的一种变形.代码照着搬都是没有问题的哦! 第一题: ...

  4. 50万数据生成6位数不重复字符串_R语言系列3:高级数据管理

    R语言系列3:高级数据管理 此文内容为<R语言实战>的笔记,人民邮电出版社出版. 从高中电脑课学VB开始,大一课内开始学习C++,到后来大二为了数模学习Matlab,到大三为了搞深度学习自 ...

  5. c语言字符串子串问题,C语言计算字符串子串出现的次数

    #include #include int substring(char *str,char *str1);//函数原型 int main(void) { char str[64]={0}; char ...

  6. 字符串子串去重之后的个数

    给定一个长度为N的字符串S,问所有它的子串Sl-r(1≤l≤r≤N),去重后有多少种. 输入描述: 一行一个字符串S. 输出描述: 一行一个整数,表示答案. 示例1 输入 ababa 输出 9 备注: ...

  7. java 字符串子串_java实现字符串匹配求两个字符串的最大公共子串

    本文实例讲述了java实现求两个字符串最大公共子串的方法.分享给大家供大家参考,具体如下: 最近在项目工作中有一个关于文本对比的需求,经过这段时间的学习,总结了这篇博客内容:求两个字符串的最大公共子串 ...

  8. 字符串之找到字符串的最大无重复字符串子串

    题目: 字符串之找到字符串的最大无重复字符子串 举例: str = "adcd" return 4 str = "aabcd"  I know this str ...

  9. [Leetcode][第459题][JAVA][重复的字符串][子串][匹配]

    [问题描述][中等] [解答思路] 1. 枚举 找出能整除的子串长度,再用substring遍历匹配即可 时间复杂度:O(N^2) 空间复杂度:O(1) class Solution {public ...

最新文章

  1. Java网络编程——11.非阻塞I/O
  2. 一文看懂BATH新基建:5G是基础,AI是内核
  3. ASP.NET页面进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)
  4. bzoj千题计划219:bzoj1568: [JSOI2008]Blue Mary开公司
  5. js中字符串转为对象或者json
  6. C语言经典例66-输入3个数a,b,c,按大小顺序输出
  7. 【Mybatis】 mapper XML 文件中使用 collection实现一对多关联
  8. Django从理论到实战(part8)--URL中添加参数
  9. sai教程初识SAI + 城堡绘画教程
  10. android qq钱包接入,QQ
  11. HTML注册登录页面模板JS
  12. Python pyserial 串口开发
  13. Quartus联合modelsim的ip核仿真——以FIFO为例——(报错问题解决)
  14. Word一部分内容分为两栏或多栏的方法
  15. 稍微好看点的登录页面html
  16. [PHP代码审计]LightCMS1.3.7存在命令执行漏洞
  17. Android录制声音文件(音频),并播放
  18. Java中的多线程安全问题
  19. JEECG容器化部署
  20. java开源bs系统_WCP是一套BS架构的开源知识管理系统、知识库系统。它.PDF

热门文章

  1. A站工具姬pc电脑版
  2. 人脸特征点检测:SDM
  3. 【题解】P2678 [NOIP2015 提高组] 跳石头
  4. 拼多多数据分析笔试题(附代码答案)
  5. 论文书写之如何引用参考文献(简单明了)
  6. 使用Windows批处理+ImageMagick 实现批量处理图片
  7. Apache Calcite论文概要
  8. 猫小胖服务器位置,最终幻想14新增猫小胖大区拆分陆行鸟大区-最终幻想14国服大区调整计划公布!-Appfound...
  9. 在.NET5 中读取Excel文件,评估下参加神秘献祭会的几位子民
  10. TestFlight应用