您的位置:首页 > 其它

【算法设计作业】week13

2017-12-03 13:50 411 查看

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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法