Lintcode--004(最小子串覆盖)
给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串。
注意事项
如果在source中没有这样的子串,返回"",如果有多个这样的子串,返回起始位置最小的子串。
在答案的子串中的字母在目标字符串中是否需要具有相同的顺序?
——不需要。
给出source = "ADOBECODEBANC",target = "ABC" 满足要求的解 "BANC"
解题:这个题目关于最小子串覆盖,跟字符串匹配还是有区别的,所以不可以用KMP来求解。
思路:
采用哈希的思想,记录字母出现次数。
【方法:可以定义一个整形数组,利用映射 map<char,int> m; 定义一个关联容器也可。】
首先预处理target,用256大小的整数数组t存储里面每个char出现的个数;
然后给定两个指标beg和end,一个移动start,也用一个256长的整数数组s记录从beg到end的这段字符串里面每个char出现的个数。如果
s大于等于t,也就是说s里的每一位大于等于t里相应位置的值,找到当前start位置,为符合要求子串的起点,记录当前beg和end的长度,如果比已经记录最小长度小,那么我们就选这个位最小窗口。记录beg和end。然后让start往前走一位。寻找下一个子串。
代码如下:
class Solution {
public:
/**
* @param source: A string
* @param target: A string
* @return: A string denote the minimum window
* Return "" if there is no such a string
*/
string minWindow(string &source, string &target) {
// write your code here
if (source.empty()||target.empty()){
return "";
}
int slength=source.length(); //size()和length()都是返回字符串的长度,本质上没有区别;
int tlength=target.length();
int s[],t[];
memset(s,,sizeof(s));
memset(t,,sizeof(t));
for(int i=;i<target.length();i++){ //统计目标串中每个字符出现的次数;
t[target[i]]++;
}
int beg = -, end = slength, found = , minLen = slength; //将最小长度先赋值为源字符串的长度;
for(int i=,start=;i<source.length();i++){//注意变量start不要拼写错误!
s[source[i]]++;
// 如果加1后这个字符的数量不超过目标串中该字符的数量,则找到了一个匹配字符
if(s[source[i]]<=t[source[i]]){ //比较源串中的字符是否在目标串中出现过;
found++;//更新出现的字符的个数;
} //为了将目标字符串中出现的字符都包含!
// 这一点很重要!!!//
// 如果找到的匹配字符数(只是记录匹配的字符数量)等于目标串长度,说明找到了一个符合要求的子串
// 这一点很重要!!!//
if(found==tlength){
//将开头没用的都跳过,没用是指该字符出现次数超过了目标串中出现的次数,并把它们出现次数都减1
while(start<i&&s[source[start]]>t[source[start]]){
s[source[start]]--;
start++;
}
//找到符合要求子串的首尾位置start 与 i, 这时候start指向该子串开头的字母,判断该子串长度
if(i-start<minLen){
minLen=i-start;
beg=start;
end=i;
}
s[source[++start]]--;
found--;//跳过无用的字符后,found减1,然后寻找更短的满足要求的字符串;
}
}
/*如果beg值为-1,说明不存在这样的子串*/
if (beg == -)
return "";
else
return source.substr(beg, end - beg + );
}
};
// 理解时,可以写一个字符串来模拟程序执行过程!
题目有一些难度,参考http://blog.csdn.net/fly_yr/article/details/51134340
应熟练此类题目。
Lintcode--004(最小子串覆盖)的更多相关文章
- lintcode 中等题:minimum window substring 最小子串覆盖
题目 最小子串覆盖 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 样例 给出source = "ADOBECODEBANC ...
- 最小子串覆盖 · Minimum Window Substring
[抄题]: 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 在答案的子串中的字母在目标字符串中是否需要具有相同的顺序? ——不需要. ...
- lintcode-32-最小子串覆盖
最小子串覆盖 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 注意事项 如果在source中没有这样的子串,返回"" ...
- 【HDU1960】Taxi Cab Scheme(最小路径覆盖)
Taxi Cab Scheme Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- loj 1429(可相交的最小路径覆盖)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1429 思路:这道题还是比较麻烦的,对于求有向图的可相交的最小路径覆盖,首先要解决成环问 ...
- 【HDU3861 强连通分量缩点+二分图最小路径覆盖】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 题目大意:一个有向图,让你按规则划分区域,要求划分的区域数最少. 规则如下:1.有边u到v以及有 ...
- POJ 3216 最小路径覆盖+floyd
Repairing Company Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 6646 Accepted: 178 ...
- POJ3020Antenna Placement(最小路径覆盖+重在构图)
Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7788 Accepted: 3880 ...
- POJ 3020 (二分图+最小路径覆盖)
题目链接:http://poj.org/problem?id=3020 题目大意:读入一张地图.其中地图中圈圈代表可以布置卫星的空地.*号代表要覆盖的建筑物.一个卫星的覆盖范围是其周围上下左右四个点. ...
随机推荐
- Thinking in C++: 第1章 为什么C++会成功
本文内容摘抄自C++经典书籍:<Thinking in C++> 操作概念:OOP程序像什么 我们已经知道,用C 语言编写的过程程序就是一些数据定义和函数调用.要理解这种程序的含义,程 ...
- Android写入文件操作权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses- ...
- Spring中Ioc容器的注入方式
1 通过setter方法注入 bean类: package com.test; public class UserServiceImplement implements IUserService { ...
- 【KMP+DP】Count the string
KMP算法的综合练习 DP很久没写搞了半天才明白.本题结合Next[]的意义以及动态规划考察对KMP算法的掌握. Problem Description It is well known that A ...
- java笔记2之算术运算符
1运算符是什么呢 对常量和变量进行操作的运算符 2运算符分为哪些 算术运算符(+,-,*,/), 赋值运算符 比较运算符 逻辑运算符 位运算符 三目运算符 3运算符 A 算术运算符的注意事项 (1)整 ...
- Linux 常用命令记录
1.查看磁盘空间使用情况 df -[a i m] 或更多 df -lh 2.查看目录文件占用大小 du -sh * du --max-depth=1 -lh 3.内存使用qingkuang free ...
- apue
#ifndef apue_h #define apue_h #define _POSIX_C_SOURCE 200809L #if defined(SOLARIS) /* Solaris 10 */ ...
- 基于jsp+servlet图书管理系统之后台用户信息删除操作
上一篇的博客写的是修改操作,且附有源码和数据库,这篇博客写的是删除操作,附有从头至尾写的代码(详细的注释)和数据库! 此次删除操作的源码和数据库:http://download.csdn.net/de ...
- 【C#基础】json数据解析
1.简单的获取某个键值 JToken jtoken = JToken.Parse(jsonStr); string jsjid = jtoken.Value<string>("J ...
- HttpClient get返回String类型 JAVA
public static String httpGet(String url) { // get请求返回结果 String strResult = ""; try { Defau ...