寻找最小子字符串
小美和小团在玩一个游戏,小美任意给出一个大字符串str1以及一个独立的小字符串str2,小团需要从这个大字符串str1里找到包含独立小字符串str2中所有字符的最小子字符串str3;
例如,小美给出一个大字符串"meituan2019"和一个子字符串"i2t",那么小团给出的答案就应该是"ituan2";
需要注意:
1、str1中有可能没有完整包含str2所有字符的情况,此时返回"",即为空字符串;
2、str1不会为空,但str2有可能为空,此时返回整个str1;
3、str2可能存在重复的字符,此时str3需要包含相等数量该字符;
思路:
记录str2中每个字符出现的次数,然后在遍历str1时,判断是否匹配完了,如果是,就从前面减少字符,直到减少后不能完全包含为止。
string getMinString(string str1, string str2) {
// write code here
string ans(str1);
map<char,int> rec1;
map<char,int> rec2;
for(int i = 0; i < str2.size(); ++i)
{
rec2[str2[i]]++;
}
int count = rec2.size();
int tmp_count = 0;
int i = 0;
int j = 0;
int flag = 0;
if(str2.size() ==0)
{
return ans;
}
//遍历
for(; i < str1.size(); ++i)
{
rec1[str1[i]]++;
if(rec1[str1[i]] == rec2[str1[i]]) //当等于时,就匹配一个字母
{
tmp_count++;
}
if(tmp_count == count) //匹配完
{
//从前减少字母
for(;j<=i;j++)
{
rec1[str1[j]]--;
if(rec1[str1[j]] < rec2[str1[j]]) //如果小于,说明有个字母匹配。
{
string tmpstr = str1.substr(j, i-j+1);
flag = 1;
if(tmpstr.size() < ans.size())
{
ans = tmpstr;
j++;
tmp_count = count-1;
}
break;
}
}
}
}
if(flag) return ans;
return "";
}