错误字符串处理
问题描述:给定一个字符串,里面含有错误字符,例如包含aabb或者ccc,将字符串中aabb型去掉一个b,ccc型去掉一个c,最终处理结果字符串内不得含有aabb或ccc类型的字符片段。
例: 输入p[] = "helloo" 处理后输出 p[] = "hello"
输入p[] = "wooooow" 处理后输出 p[] = "woow"
解决思路:
aabb和ccc的共同之处是前俩字符都相同,那么对字符串进行遍历,记录前一个字符(be),只要当前字符与前一个字符相同就进入判断改正分支。在判断时要优先考虑越界,其次再考虑是否为aabb或ccc类型。这里还有一个关键点,就是当前字符指针 (pa[i]) 的回退。例如aabb假设遍历指针当前在第二个a,接着发现了后两个也相同,经过修改变成了aab,这时字符指针还指向第二个a,按照惯性逻辑,既然我们处理完了就应该将指针(pa[i])向前进,可是问题就出在这,我们无法保证aab后边的字符是否还是b,所以一定要将字符指针回退到第一个a后再继续遍历,这样才够保证没有漏网之‘符’。还有就是别忘了给处理后的字符长度(len)减一,并在处理完以后为字符串尾部加上'\0'。
#include<iostream>
#include<string.h>
using namespace std;
void func(char *pa)
{
int len = strlen(pa);
int i = 0, tmp = 0;
char be = '\0';
while(i < len)
{
if(be != pa[i])
{
be = pa[i];
++i;
continue;
}
else
{
if(i+1<len && pa[i+1]==pa[i])//AAA
{
tmp = i;
while(tmp+1<len)
{
pa[tmp] = pa[tmp+1];
++tmp;
}
--len;
be = '\0'; //回退
--i;
continue;
}
else if(i+2<len && pa[i+2]==pa[i+1])//AABB
{
tmp = i;
while(tmp+2<len)
{
pa[tmp+1] = pa[tmp+2];
++tmp;
}
be = pa[i];
--i;
be = '\0'; //回退
--len;
continue;
}
else //AABC
{
++i;
continue;
}
}
}
pa[len] = '\0';
}
int main()
{
char p[32];//= "helloo", q[] = "wooooow";
while(1)
{
cout<<"Please input error String include str AABB, CCCCC:";
cin>>p;
func(p);
cout<<"result of handling:"<<p<<endl;
}
return 0;
}
看看运行结果

还行
不积小流无以成江河

浙公网安备 33010602011771号