字符串的最小窗口问题
2016-05-11 10:13
274 查看
给定两个字符串T和S,找出在S中包含字符串T的最小子字符串,要求时间复杂度为O(n)。
如果不存在最小窗口,则返回”“;
例如,
S =
T =
返回的最小窗口是
实验的代码如下所示:
如果不存在最小窗口,则返回”“;
例如,
S =
"ADOBECODEBANC"
T =
"ABC"
返回的最小窗口是
"BANC".
实验的代码如下所示:
#include<iostream> #include<string> #include<vector> using namespace std; string minWindow(string &S, string &T) { int Slen = S.length(); int Tlen = T.length(); if (Slen < Tlen || T.empty()) { return ""; } vector<int> ToBeFind(128, 0); vector<int> Found(128, 0); for (int i = 0; i != Tlen; ++i) { ToBeFind[T[i]]++; } int Count = Tlen; int first = 0; int last = 0; int minfirst = 0; int minlast = 0; int minlength = INT_MAX; Found[S[0]]++; if (Found[S[0]] <= ToBeFind[S[0]])//先比较第一个字符是为了处理T为单个字符的特例 { Count--; } while (true) { if (Count == 0) { while (Found[S[first]] > ToBeFind[S[first]]) { Found[S[first]] --; first++; } int length = last - first + 1; if (length < minlength) { minfirst = first; minlast = last; minlength = length; } } if (last < Slen) { last++; Found[S[last]]++; if (Found[S[last]] <= ToBeFind[S[last]]) { Count--; } } else { break; } } if (minlength == INT_MAX) { return ""; } return S.substr(minfirst, minlength); } int main() { string S1 = "ADOBECODEBANC"; string S2 = "ABC"; string S3 = "A"; cout << minWindow(S1, S2) << endl; cout << minWindow(S3, S2) << endl; system("pause"); return 0; }实验结果如下所示:
相关文章推荐
- Butter Knife
- Android Studio运行时gradle错误
- Linux进程间通信——管道
- ios添加图片资源报(ImageAsset)错和警告
- jQuery学习和知识点总结归纳
- 随机打乱一个数组,无重复的获取一定范围内的随机数
- iOS获取UUID,并使用keychain存储
- js中基本操作
- centos常用命令
- css定义超级链接a标签里面的title的样式
- Python 代码风格 和 PEP8
- php pdo 连接MySQL数据库
- Android App开发中创建Fragment组件的教程
- HDU 5016 Mart Master II
- 把本地git上传到github
- JBOSS EAP实战(1)
- 聊聊同步、异步、阻塞与非阻塞
- 向其他进程注入代码的三种方法(injectdll)
- JBOSS EAP实战(1)
- zyUpload界面绝佳、体验超棒的HTML5上传插件