错误字符串处理

问题描述:给定一个字符串,里面含有错误字符,例如包含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; }

 看看运行结果

 

 还行

posted @ 2019-11-07 15:24  C_hp  阅读(464)  评论(0编辑  收藏  举报