提示:以下是本篇文章正文内容,下面案例可供参考
1.自己的暴力解法
无
2.自己的进阶解法
class Solution {
public:
string minWindow(string s, string t)
{
vector<char> v; // 对t使用unique后得到的容器
for (auto ch : t) v.push_back(ch);
sort(v.begin(), v.end());
vector<char>::iterator it = unique(v.begin(), v.end());
v.resize(distance(v.begin(), it));
vector<int> c, d; // 用于对v的各个元素计数的容器c,用于记录v应该拥有的数量的容器d
for (int i = 0; i < v.size(); ++i) c.push_back(0), d.push_back(0);
for (int i = 0; i < t.size(); ++i)
for (int j = 0; j < v.size(); ++j) if (t[i] == v[j]) ++d[j];
pair<int, int> fanwei = { 0, 0 }; // 保存s的最小范围的一个pair
int min = 99999999; // s的最小长度;
for (int i = 0, j = 0; j < s.size(); ++j) // i是起始位置,j是终止位置
{
vector<char>::iterator it2 = find(v.begin(), v.end(), s[j]); // 取到v的迭代器,判断s内j号元素是否是v内元素
if (it2 != v.end()) ++c[distance(v.begin(), it2)]; // 如果s内j号元素是v内元素,v内该元素计数+1
bool bo = true; // 一个用于判断当前s序列片段是否满足要求的bool值
for (int k = 0; k < c.size(); ++k) // 判断当前s片段是否满足覆盖t的要求
if (c[k] < d[k])
{
bo = false;
break;
}
while (bo == true) // 如果s片段已经涵盖了t内的全部字母
{
int num = j - i + 1; // 计算当前s片段的长度
if (min > num) // 如果该s片段比之前的都短
{
min = num < min ? num : min; // 更新答案
fanwei.first = i, fanwei.second = j; // 更新范围
}
vector<char>::iterator it3 = find(v.begin(), v.end(), s[i]); // 取到v的迭代器,判断s内i号元素是否是v内元素
if (it3 != v.end()) // 如果s内i号元素是v内元素
{
++i;
--c[distance(v.begin(), it3)];
}
else ++i; // 如果s内i号元素不是v内元素
bo = true; // 再判断当前s片段是否满足覆盖t的要求
for (int k = 0; k < c.size(); ++k)
if (c[k] < d[k])
{
bo = false;
break;
}
}
}
string ans; // 答案
for (int i = fanwei.first; i <= fanwei.second; ++i) ans.push_back(s[i]); // 生成答案
return min == 99999999 ? "" : ans; // 如果找到了符合的序列就返回答案,否则返回""
}
};
3.自己的库函数解法
无
4.题解的暴力解法
无
5.题解的进阶解法
class Solution {
public:
string minWindow(string s, string t) {
unordered_map<char, int> hs, ht;
for (auto c: t) ht[c] ++ ;
string res;
int cnt = 0;
for (int i = 0, j = 0; i < s.size(); i ++ ) {
hs[s[i]] ++ ;
if (hs[s[i]] <= ht[s[i]]) cnt ++ ;
while (hs[s[j]] > ht[s[j]]) hs[s[j ++ ]] -- ;
if (cnt == t.size()) {
if (res.empty() || i - j + 1 < res.size())
res = s.substr(j, i - j + 1);
}
}
return res;
}
};
6.总结
有点难一题目,终于搞完了。