删除字符串中两个字符中的字符串(最近原则且非贪婪模式)
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可以在原有算法上改进,但是,仔细一想,这个算法的设计是存在问题的,因为,被递归调用的函数与外层函数的逻辑行为不一致;递归调用应该只做一件事情,只删除一对配对字符间的字符串,而不是删除多对,每个被递归调用的函数只需要删除一对,而它后面的多对应该由外层函数去删除,这样逻辑肯定是不会对的。
*/
{
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可以在原有算法上改进,但是,仔细一想,这个算法的设计是存在问题的,因为,被递归调用的函数与外层函数的逻辑行为不一致;递归调用应该只做一件事情,只删除一对配对字符间的字符串,而不是删除多对,每个被递归调用的函数只需要删除一对,而它后面的多对应该由外层函数去删除,这样逻辑肯定是不会对的。
*/
相关文章推荐
- 使用正则表达式删除一个字符串中特定两个字符之间的所有字符
- 输入两个字符串,从第一字符串中删除第二个字符串中所有的字符
- 剑指offer相关题目,输入两个字符串,从第一个字符串中删除在第二个字符串中出现的所有字符
- 输入两个字符串,从第一字符串中删除第二个字符串中所有的字符
- 输入两个字符串,从第一字符串中删除第二个字符串中所有的字符
- 输入两个字符串,从第一字符串中删除第二个字符串中所有的字符
- 输入两个字符串,从第一字符串中删除第二个字符串中所有的字符
- [两个指针]删除字符串中指定的字符
- 正则表达式 取两字符中间的字符串(双向非贪婪模式)
- 给定两个字符串,从A中删除存在于B中的字符
- 输入两个字符串,从第一个字符串中删除第二个字符串中出现过的所有字符
- 输入两个字符串,从第一个字符串中删除第二个字符串中的所有字符,例如输入“They are student”,则删除之后的第一个字符串变成了“Thy r stdnts”
- 删除字符串中相临字符中两个相同的字符
- 输入两个字符串,从第一字符串中删除第二个字符串中所有的字符(转自CSDN)
- git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0
- Delete characters删除两个字符串中相同的字符
- 输入两个字符串,从第一字符串中删除第二个字符串中所有的字符
- ACM-输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”
- Leetcode712. 计算两个字符串删除任意字符后使二者相等的最小删除字符和
- 字符串处理的两个问题:删除指定字符,删除相邻相同的字符