饭不食,水不饮,题必须刷
C语言免费动漫教程,和我一起打卡! 《光天化日学C语言》
LeetCode 太难?先看简单题! 《C语言入门100例》
数据结构难?不存在的! 《画解数据结构》
LeetCode 太简单?算法学起来! 《夜深人静写算法》
给定两个字符串
s
和t
。返回s
中包含t
的所有字符的最短子字符串。如果s
中不存在符合条件的子字符串,则返回空字符串 “” 。如果s
中存在多个符合条件的子字符串,返回任意一个。注意: 对于t
中重复字符,我们寻找的子字符串中该字符数量必须不少于t
中该字符数量。
样例输入:s = "ADOBECODEBANC", t = "ABC"
样例输出:"BANC"
char * minWindow(char *s, char *t) {
}
( 1 ) (1) (1) LeetCode 76. 最小覆盖子串
( 2 ) (2) (2) 剑指 Offer II 017. 含有所有字符的最短字符串
1)遍历统计一遍,利用哈希记录有多少种不同的字符记录下来,并且记录每种字符个数;
2)然后利用 尺取法 进行区间贪心。
int hash[256];
char * minWindow(char *s, char *t) {
int cnt = 0, needCnt = 0;
int tlen = strlen(t);
int slen = strlen(s);
char *ret;
memset(hash, 0, sizeof(hash));
for(int i = 0; i < tlen; ++i) {
if(!hash[ t[i] ]) // (1)
++needCnt;
++ hash[ t[i] ];
}
int i = 0, j = -1;
int l = 0, r = -1, ans = 1000000; // (2)
int size = slen;
while(j < size - 1) { // (3)
++j;
if(--hash[ s[j] ] == 0) { // (4)
++cnt;
}
while(cnt == needCnt) { // (5)
if(j - i + 1 < ans) { // (6)
ans = j - i + 1;
l = i;
r = j;
}
if( ++hash[ s[i] ] > 0 ) { // (7)
--cnt;
}
++i;
}
}
ret = (char *)malloc(r - l + 1 + 1); // (8)
size = 0;
for(int i = l; i <= r; ++i) {
ret[size++] = s[i];
}
ret[size] = '\0';
return ret;
}
hash
代表字符计数,如果为零,则字符种类计数器加一;在 C语言中,可以采用 直接定址法 将 字符直接映射到长度为 256 的哈希数组中。