您的位置:首页 > 其它

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

2012-10-26 15:10 330 查看
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可以在原有算法上改进,但是,仔细一想,这个算法的设计是存在问题的,因为,被递归调用的函数与外层函数的逻辑行为不一致;递归调用应该只做一件事情,只删除一对配对字符间的字符串,而不是删除多对,每个被递归调用的函数只需要删除一对,而它后面的多对应该由外层函数去删除,这样逻辑肯定是不会对的。

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐