大家好!下面是我(一个小小的搬运工)在秋招的时候在Leetcode上整理的一些字符串的题目(中等难度),笔试和面试考相似思路题目的概率比较大,大家如果准备春秋季招聘可以先根据这些题目复习(具体思路可以看Leetcode中的讲解——困难的题有链接):
//2019_06_02
/*
1、Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
For example,
S ="ADOBECODEBANC"
T ="ABC"
Minimum window is"BANC".
*/
class Solution {
public:
//维持一个窗口滑动,左边是left,右边是right,然后判断是否包含T
string minWindow(string S, string T)
{
string result;
if(!S.size() || !T.size())
{
return result;
}
map<char, int>Tmap; //存储T字符串里字符,便于与S匹配
int left = 0; //左边窗口,起始为0
int count = 0; //计数器,对窗口内T串字符数量进行计数,起始为0
//装载T串
int minlen = S.size() + 1; //最小窗口,便于比较最后取最小的,初始化取最大
for(int i = 0; i < T.size(); ++i)
{
Tmap[T[i]]++;
}
//移动右边窗口
for(int right = 0; right < S.size(); ++right)
{
if(Tmap.find(S[right]) != Tmap.end()) //当窗口内部有T中的字符
{
if(Tmap[S[right]] > 0)
{
count++; //计数器+1
}
Tmap[S[right]]--; //去掉包含的,剩下都是没包含的
while(count == T.size())//当窗口内有T的所有字符,就要开始移动左窗口啦
{
if(Tmap.find(S[left]) != Tmap.end()) //在S中找到T字符串的第一个开头字母
{
//好了,这就是一个包含字符串的窗口范围:left ~ right,
//判断是否比当前窗口还小,是就取串
if(minlen > right - left + 1)
{
//更新窗口大小
minlen = right -left + 1;
result = S.substr(left, right - left + 1);
}
//舍弃窗口左边字符串,继续移动窗口
Tmap[S[left]]++; //表明S[left]字母需要重新查找(即大于0表示需要重新查找)
if(Tmap[S[left]] > 0) //如果左边连续相同,则count不递减,窗口需要继续向右移动
{
count--;
}
}
left++; //移动左窗口 找到第一个T中字母在S中的位置
}
}
}
return result;
}
};
/*
2.给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。
输入:
s: "cbaebabacd" p: "abc"
输出:
[0, 6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的字母异位词。
起始索引等于 6 的子串是 "