每日算法题三道之给定一个字符串求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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值