【算法设计作业】week13
来源:互联网 发布:什么叫历史影视剧 知乎 编辑:程序博客网 时间:2024/06/11 22:20
30. Substring with Concatenation of All Words
题目来源:https://leetcode.com/problems/substring-with-concatenation-of-all-words/description/
思路
本道题的思路是滑动窗口,一个窗口windows在字符串S上滑动,每一个位置都检验窗口的内容是否满足条件,如果满足,则记录这个窗口的开始位置。
而对于windows内是否满足的判定又有技巧。因为我们不要求次序,而只要出现过。因而可以用unordered_map记录每个word出现的次数。这样就不需要双重循环来判断,判定的复杂度降到低过O(n^2)
参考代码
来自本题目的discussion。
class Solution {public: vector<int> findSubstring(string s, vector<string>& words) { unordered_map<string, int> counts; for(string word: words){ counts[word]++; } int n = s.length(), num = words.size(), lenOfWord = words[0].length(); vector<int> indexes; for(int i = 0; i < n - num*lenOfWord+1; i++) { unordered_map<string, int> seen; int j = 0; for(; j < num; j++) { string word = s.substr(i+j*len, len); if(counts.find(word) != counts.end()) { seen[word]++; if (seen[word] > counts[word]) break; } else { break; } } if (j == num) indexes.push_back(i); } return indexes; }};
32. Longest Valid Parentheses
题目来源:https://leetcode.com/problems/longest-valid-parentheses/description/
思路
这题非常巧妙,思路是动态规划。
我们定义dp数组的第i个元素代表,以第s[i]终结的合法括号匹配串。显然只有以’)’结尾的括号串才可能合法。而以’(‘结尾的必定是不合法的,因为括号未全部匹配,此时s[i]=0。
考虑动态规划的update函数:
a.当遇到x()
的情况时,这里的x是一个字符串,s[i]
和s[i-1]
匹配了,因而
dp[i] = dp[i-2]+2
。这里,()
的长度是2,而x的长度我们不用管,无关x是否合法,我们直接加,结果都是正确的。
b.当遇到xy(...))
的时候,此处y
是一个字符,我们就要看y
和最后的)
是否匹配。如果y
为)
,显然是不匹配的,那么dp[i]=0
,不用管。如果y
是(
那么,就匹配了,则
dp[i] = dp[i-1]+dp[i-dp[i-1]-2]+2
这里dp[i-1]
就是(...)
的长度,dp[i-dp[i-1]-2]
就是x
长度,而不管x长度多少,因为加上去总是正确的,原因跟a类似。而2
就是最后的)
和对应的(
的长度。
由a,b两种情况,我们就讨论完了。照着就可以写出状态转移方程了。
参考代码
有参考本题的solution。
class Solution {public: int longestValidParentheses(string s) { int maxans = 0; vector<int> dp; dp.resize(s.length()); for (int i = 1; i < s.length(); i++) { if (s[i] == ')') { if (s[i - 1] == '(') { dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2; } else if (i - dp[i - 1] > 0 && s[i - dp[i - 1] - 1] == '(') { dp[i] = dp[i - 1] + ((i - dp[i - 1]) >= 2 ? dp[i - dp[i - 1] - 2] : 0) + 2; } maxans = max(maxans, dp[i]); } } return maxans; }};
- 【算法设计作业】week13
- 算法设计Week13 LeetCode Algorithms Problem #64 Minimum Path Sum
- week13
- 算法设计作业;贪心;
- 算法设计作业1
- 算法设计作业2
- 算法设计作业3
- 算法设计作业4
- 算法设计作业5
- 算法设计作业6
- 算法设计作业7
- 算法设计作业8
- 算法设计作业9
- 算法设计作业10
- 算法设计作业11
- 算法设计作业12
- 算法设计作业13
- 算法设计作业14
- 来自电商师妹的一道Java小题
- Python+Pycharm使用opencv
- Linux云服务器初学之一 ——熟悉linux的yum工具
- 多任务与多线程
- Linux-007 CentOS7安装图形界面并设置默认启动方式
- 【算法设计作业】week13
- 【洛谷P1000 超级玛丽游戏-100分】
- spring文件上传
- Xamarin入门 PhoneWord程序
- EasyDemo*获取当前日期&求两个日期相隔天数
- mysql第一次没法登陆的问题
- kubernetes调度之NodeSelector
- unity3d 第二天脚本生命周期
- python中pip为什么比easy_install好