删除字符串中两个字符中的字符串(最近原则且非贪婪模式)

void delStr(CString& theStr,int nstart,const char cstart,const char cend)
{
int cstartIndex = 0,cendIndex = 0;
int i = nstart;
BOOL BstartFind = FALSE;
while (i < theStr.GetLength())
{
if(theStr.GetAt(i) == cstart)
{
if(BstartFind) //之前已经找到了一个cstart字符
{
delStr(theStr,i,cstart,cend); //递归调用,寻找下一组配对字符
}
else
{
BstartFind = TRUE;
}
}
else if(theStr.GetAt(i) == cend)
{
if(!BstartFind)  //现在找到了cend字符,但之前还没有找到cstart字符,等价于还没有找到cend字符
{
//
}
else //之前已经找到了cstart字符,现在要删除这一配对的(cstart,cend)中的字符串
{
theStr.Delete(nstart,i - nstart + 1); //删除字符串
i = nstart - 1; //删除字符串后应该改变已经寻找到的位置
BstartFind = FALSE; //删除字符串后应该标记cstart没有被找到
}
}
i ++;
}

}



/*

这个算法单从功能上说是有一点问题的,考虑要删除字符串:#sdfk-#cdef#---###abid-中以 # 和 - 之间的字符,其结果为##,原因在于当删除到原字符串为#cdef--##的时候,要执行递归调用的返回,i依次呈现为9 , 8 ,7 ,6 ,当i = 6的时候,这个时候,最外层调用函数已经指示了BstartFind为真,则直接删除了 #cdef--,也就多删除了一个 - ,所以结果不对。

虽然这个BUG可以在原有算法上改进,但是,仔细一想,这个算法的设计是存在问题的,因为,被递归调用的函数与外层函数的逻辑行为不一致;递归调用应该只做一件事情,只删除一对配对字符间的字符串,而不是删除多对,每个被递归调用的函数只需要删除一对,而它后面的多对应该由外层函数去删除,这样逻辑肯定是不会对的。

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值