|
10鱼币
新写的一个想法,在评论区找不到参考,可以通过题目给的测试,但提交时的测试用例:"a""a";返回结果是"",不知道哪里错了
题目链接:https://leetcode-cn.com/problems/minimum-window-substring/
- class Solution {
- public:
- string minWindow(string s, string t) {
- int k=0;
- int p=0,q=0;
- int Minresult=s.size();
- int Min=0;
- string result,r;
- for(int i=0;i<s.size()-t.size();i++)
- {
- for(int j=i;j<s.size()&&k<t.size();j++)
- {
- if(t[k]==s[j])
- {
- k++;
- Min=max(Min,j); //表示以i开头,这一段至少需要的子串
- j=i-1;
- continue;
- } //得到从i到Min的一串子串为需要的子串(但不一定是最小子串)
- }
- if(Minresult>Min-i&&(Min-i+1)>=t.size()&&k==t.size())
- {
- Minresult=Min-i+1;
- p=Min;
- q=i; //用p,q存储最小子串的首尾位置
- }
- Min=0;
- k=0;
- }
- //循环结束,返回以q开头,p结束的最小子串
- if(p==0&&q==0)
- {
- result[0]='""';
- }
- else
- {
- for(int h=q;h<=p;h++)
- {
- result.push_back(s[h]);
- }
- }
- return result;
- }
- };
复制代码
希望大佬们可以看看哪里错了,谢谢!
这个算法不对,你现在是 j 一直后移,k 是在匹配到字符才后移,题目要求不是这样的
用这个思路写吧,虽然这个思路超时,但是至少正确
- 这道题的思路是:
- 1) begin开始指向0, end一直后移,直到begin - end区间包含T中所有字符。
- 记录窗口长度d
- 2) 然后begin开始后移移除元素,直到移除的字符是T中的字符则停止,此时T中有一个字符没被
- 包含在窗口,
- 3) 继续后移end,直到T中的所有字符被包含在窗口,重新记录最小的窗口d。
- 4) 如此循环知道end到S中的最后一个字符。
复制代码
- for(size_t j = i; j < s.size() && k < t.size(); j++)
- {
- if(t[k] == s[j])
- {
- k++;
- // max 赋值给 min ?
- // 把最大的赋值给最小的?这是什么操作?
- Min = max(Min, j); //表示以i开头,这一段至少需要的子串
- Delete(s, j); //在这个循环中把s中已经使用过的j删除,避免无法判断重复元素
- j = i - 1;
- // 为什么要加这个 continue ?
- // 这里的 continue 对程序没有任何影响
- // 加不加都一样
- //continue;
- } //得到从i到Min的一串子串为需要的子串(但不一定是最小子串)
- }
复制代码
- #include <iostream>
- #include <string>
- #include <algorithm>
- using namespace std;
- class Solution {
- public:
- //void Delete(string x,int n)
- void Delete(string &x,int n)
- {
- size_t i;
- for(i=n;i<x.size()-1;i++)
- {
- x[i]=x[i+1];
- }
- x[i-1]=' ';
- }
- string minWindow(string s, string t) {
- size_t k = 0;
- int p = -1, q = -1;
- size_t Minresult = s.size();
- size_t Min = -1;
- string result, r, S = s;
- #if 0
- if(s.size()<t.size())
- {
- /*
- result="";
- return result;
- */
- return "";
- }
- if(s == t)
- {
- return s;
- }
- #endif
- if(s == t) return s;
- if(s.size() < t.size()) return "";
- for(size_t i = 0; i <= s.size() - t.size(); i++)
- {
- std::cout << "i: " << i << std::endl;
- for(size_t j = i; j < s.size() && k < t.size(); j++)
- {
- std::cout << "k: " << k << ", " << "t[k]: " << "'" << t[k] << "'" << std::endl;
- std::cout << "j: " << j << ", " << "s[j]: " << "'" << s[j] << "'" << std::endl;
- std::cout << std::endl;
- if(t[k] == s[j])
- {
- k++;
- // max 赋值给 min ?
- // 把最大的赋值给最小的?这是什么操作?
- Min = max(Min, j); //表示以i开头,这一段至少需要的子串
- Delete(s, j); //在这个循环中把s中已经使用过的j删除,避免无法判断重复元素
- j = i - 1;
- // 为什么要加这个 continue ?
- // 这里的 continue 对程序没有任何影响
- // 加不加都一样
- //continue;
- } //得到从i到Min的一串子串为需要的子串(但不一定是最小子串)
- }
- if(Minresult > Min - i && (Min - i + 1) >= t.size() && k == t.size())
- {
- Minresult = Min - i + 1;
- p = Min;
- q = i; //用p,q存储最小子串的首尾位置
- }
- Min = -1;
- k = 0;
- s = S; //还原s,开始下一次循环
- }
- //循环结束,返回以q开头,p结束的最小子串
- if(p == -1 && q == -1) return "";
- return string(&s[q], &s[p + 1]);
- #if 0
- if(p==-1&&q==-1)
- {
- result="";
- }
- else
- {
- /*
- for(int h=q;h<=p;h++)
- {
- result.push_back(s[h]);
- }
- */
- result = string(&s[q], &s[p + 1]);
- }
- return result;
- #endif
- }
- };
- int main() {
- std::cout << Solution().minWindow("bbaa", "aba") << std::endl;
- return 0;
- }
复制代码
|
最佳答案
查看完整内容
这个算法不对,你现在是 j 一直后移,k 是在匹配到字符才后移,题目要求不是这样的
用这个思路写吧,虽然这个思路超时,但是至少正确
|