每日算法题三道之给定一个字符串求k个不同字符的最长子串

题目:
给定字符串str,计算最多包括k个不同字符的最长子串,如给定字符串”eceba”和k=3,则包括3个不同字符的最长子串为”eceb”
思路
用两个变量i,j分别标志字符串子串的起始位置和终止位置str[i,j],两次for循环,外层起始位置,内层终止位置来暴力找子串str[i,j],当找到的子串str[i,j]中不同字符的个数小于k时继续遍历,等于时若大于原先找到的子串则更新,大于时结束内层遍历。
代码:
/*****************************
功能:求一个字符串中包括k个字符的最大子串
@athor: rly
@date: 2018-3-06
******************************/

include

include

include

include

include

include

using namespace std;

/***********************
@param:
SrcStr:给定的字符串
chNum :要包含的不同字符的个数
start:最终找到的子串在源字符串中的起始位置
end: 最终找到的子串在源字符串中的终止位置
@return:最终找到的子串
***********************/
string MaxKdefChStr(const string SrcStr /* in /, int chNum,int &start / out /, int &end / out */)
{
if (SrcStr.size() <= 0 || chNum <= 0)
{
return “”;
}
string finalOut = “”;
for (int i = 0; i < SrcStr.size(); i++)
{
string tmp = “”;
set chContain;
for (int j = i; j < SrcStr.size(); j++)
{
chContain.insert(SrcStr[j]); //放入set容器中用来计算当前的子串中有多少个不同的字符

        if (chContain.size() <= chNum)
        {
            tmp += SrcStr[j];
        }
        if (chContain.size() == chNum && tmp.size() > finalOut.size())
        {
            finalOut = tmp;
            start = i;
            end = j;
        }                                 //找到k个不同字符的子串,更新要找到的最大k个不同字符子串
        else if (chContain.size() > chNum)
        {
            break;
        }
    }
}
return finalOut;

}

猜你喜欢

转载自blog.csdn.net/rlyhaha/article/details/79485942