当前位置: 首页 > news >正文

leetcode 困难题 1520. 最多的不重叠子字符串

Problem: 1520. 最多的不重叠子字符串

对每种字符得到开始和结束的区间,然后对每种字符的区间内部的字符,计算得到满足题意的最长区间,也就是当前字符和内部字符两者区间的并集,最后按照字符开始索引排序

回溯,得到选择的区间的总长度,选择的个数,个数最大化,若个数相同则选择总长度更小的

Code

class Solution { public: vector<pair<int, int>> ump, tr; vector<int> tmp, ret, mem, same; int m, mxmx = -1, c1, c3, ind, mi = INT_MAX; void update(int cnt, int len) { if(mxmx < cnt) { mxmx = cnt; ret = tmp; mi = len; } else if (mxmx == cnt) { if(mi > len) ret = tmp; } } int dfs( int index, int end, int cnt, int len ) { if(len >= mi) return INT_MIN/100; if(index == m) { update(cnt, len); return 0; } // if(mem[index] > 0) { // tmp.push_back(); // } int r1, r2, mx, sss, eee; for( int i = index; i < tr.size(); i++ ) { sss = tr[i].first; eee = tr[i].second; if( sss > end ) { tmp.push_back(i); r1 = dfs( i + 1, eee, cnt + 1, len + eee - sss + 1) + 1; tmp.pop_back(); if(same[i] < 0) r2 = dfs( i + 1, end, cnt, len); mx = max( { mx, r1, r2 } ); } } // mem[index] = mx; return mx; } vector<string> maxNumOfSubstrings(string s) { ump.assign(26, {-1, -1}); mem.assign(26, -1); int n = s.size(), ch; for( int i = 0; i < n; i++ ) { ch = s[i] - 'a'; if(ump[ch].first < 0) ump[ch].second = ump[ch].first = i; else ump[ch].second = i; } int start, end, key, change = 1; while(change > 0) { change = -1; for(int i = 0; i < 26; i++) { if(ump[i].first < 0) continue; start = ump[i].first; end = ump[i].second; if(end - start <= 1) continue; unordered_set<char> te( s.begin() + ump[i].first + 1, s.begin() + ump[i].second ); for(const char& cc : te) { if(start > ump[cc-'a'].first) { change = 1; start = ump[cc-'a'].first; } if(end < ump[cc-'a'].second) { change = 1; end = ump[cc-'a'].second; } } ump[i] = {start, end}; } } unordered_set<long long> te; for(int i = 0; i < 26; i++) { if(ump[i].first < 0) continue; start = ump[i].first; end = ump[i].second; key = (start << 20) + end; if(te.find(key) != te.end()) continue; tr.push_back(ump[i]); te.insert(key); } sort(tr.begin(), tr.end()); m = tr.size(); same.assign(m, -1); for(int i = 0; i < m; i++) { if(end - start <= 1) { same[i] = 1; continue; } unordered_set<char> te( s.begin() + ump[i].first, s.begin() + ump[i].second); if(te.size() == 1) same[i] = 1; } dfs(0, -1, 0, 0); vector<string> answer; for(int i = 0; i < ret.size(); i++) { ch = ret[i]; answer.push_back( s.substr(tr[ch].first, tr[ch].second - tr[ch].first + 1) ); } return answer; } };
http://www.jsqmd.com/news/546131/

相关文章:

  • 2026 Agent元年!微软开源AI Agent教程,手把手带你入门爆款应用开发!
  • JTAG接口技术解析与工程实践指南
  • 保姆级教程:用Docker快速搭建一个可复现的Hive测试环境(专治各种启动报错)
  • Cursor Free VIP终极指南:突破试用限制的完整解决方案
  • Others think you are suitable...... dont read.
  • PyTorch内存爆炸?手把手教你解决RuntimeError: DefaultCPUAllocator not enough memory
  • AD7124多通道配置实战:从寄存器映射到混合模式应用
  • Fabric模组开发第一步:看懂Gradle项目结构比写代码更重要
  • YOLOv3-tiny网络层逐行解析:从cfg文件到前向传播的23层到底发生了什么?
  • JumpServer资产管理实战:从零配置Linux服务器接入到用户权限分配
  • 存算分离架构演 进 : TDengine 时 序数据 库 在混合云 环 境下的高 可用策略
  • 当你的Minecraft世界崩溃时:一个Python工具如何成为你的数字救世主
  • 别再只盯着ODD了!从特斯拉FSD和华为ADS的实战,聊聊ODC(设计运行条件)到底怎么落地
  • 2026年03月27日热门Model/github项目
  • 【读书笔记】《逆风跑者》
  • 人形机器人避坑指南:从Optimus Gen2拆解看核心零部件选型要点
  • 如何用这款开源工具实现专业级图像编辑?完全免费!
  • 用Arduino UNO+W5100网卡,5分钟搞定西门子S7-200 Smart数据读取(附完整代码)
  • 现代中文斜体字体的架构设计与技术实现:Smiley Sans 得意黑的工程实践
  • 3大职业场景实测:Win11Debloat如何让系统性能提升80%?
  • 3个核心方法实现暗影精灵硬件控制与性能调优:告别原厂软件烦恼
  • 大数据场景下ClickHouse的性能优化策略
  • 告别激光雷达!用OAK-4P-New四鱼眼相机+OmniNxt,手把手搭建你的纯视觉无人机(保姆级教程)
  • GLM-4-9B-Chat-1M开源可部署优势:对比HuggingFace原生加载的内存节省57%
  • OpenClaw 的对话系统是否支持对话流程的可视化编辑?如何定义状态机?
  • 具身智能的sim2real实战指南:从仿真到现实的三大关键跨越
  • 宝塔面板下phpMyAdmin导入大文件报错?三步搞定Incorrect format parameter问题
  • nvitop:GPU资源可视化与进程管理全攻略
  • 保姆级教程:用STK批量导入TLE文件,快速构建北斗三号卫星星座
  • 企业级富文本编辑器实战:ReactQuill深度定制与性能优化指南