子串/子段问题总结
来源:互联网 发布:玻璃深加工软件 编辑:程序博客网 时间:2024/04/27 19:31
1. 一般子串问题:求一个串中满足某种条件的子串
1)如果所求子串的条件是一个值,比如sum,则考虑子段问题,注意这样一个性质,子段= 前缀差,子段和=前缀和的差,
vector<int> subarraySumClosestToZero(vector<int> nums){ // write your code here if (nums.empty()) return vector<int>(); vector<pair<int,int>> prefixSum; prefixSum.push_back(make_pair(0, -1)); for (int i = 0;i < nums.size(); ++i) prefixSum.push_back(make_pair(nums[i] + prefixSum.back().first, i)); sort(prefixSum.begin(), prefixSum.end()); int minDiff = INT_MAX, start = 0, end = 0; for (int i = 1; i < prefixSum.size(); i++) { if (abs(prefixSum[i].first - prefixSum[i-1].first) < minDiff) { minDiff = abs(prefixSum[i].first - prefixSum[i-1].first); start = min(prefixSum[i].second, prefixSum[i-1].second) + 1; end = max(prefixSum[i].second, prefixSum[i-1].second); } } return vector<int> {start, end};}
一个经典题,求01串中最大的0和1个数相等的字串
解法:0看作-1, 1看作1,等于是求最长的和为0的子段,转化成前缀和数组后,求相等的两个值,index距离最远的那两个。
2)如果满足满足滑动窗口的条件,滑动窗口法。
3)回文子串等不满足1),2)的,dp的方向考虑
4)暴力,但注意不是枚举所有子串(O(n^2))而是枚举终点。
2. 两个串中子串问题,或者一个串中多个子串问题
LCS: f[i][j] = f[i-1][j-1]+1 (s[i-1]==t[i-1]) or 0
LRS: 后缀数组法,计算后缀数组,排序,相邻元素求最长前缀
0 0
- 子串/子段问题总结
- 子段和问题
- 最大子段和、子矩阵总结
- 子序列与子串问题总结
- 动态规划之最大子段和问题总结
- 【转】最大子段和问题分析和总结
- 最大子段和问题
- 最大子段和问题
- 最大子段和问题
- 最长子段问题求解
- 最大子段和问题
- 最大子段和问题
- 最大子段和问题
- 最大子段和问题
- 最大子段和问题
- 最大子段和问题
- 最大子段和问题
- 最大子段和问题
- 十一月总结
- Java工厂模式 工厂方法模式 抽象工厂
- 编程语言的演化
- 如何开始学习高伸缩性编程
- 信号与系统推荐书籍
- 子串/子段问题总结
- Maven构建SpringMVC+Mybatis+druid+rest
- 鸟哥私房菜实践(1)- ACL
- 猎人,羊,狼,白菜
- C语言sscanf函数的总结
- ruby调用Office Jet引擎压缩access数据库
- 【jQwidgets】Grid Cells Formatting
- [LeetCode] Palindrome Partitioning 回文分割
- (软工视频总结)之软件维护和用户界面设计