错误字符串处理
问题描述:给定一个字符串,里面含有错误字符,例如包含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; }
看看运行结果
还行
不积小流无以成江河