算法思路:
假设当前待处理字符位于目标字符数组的Snow处,当前结果字符数组的可用位置为Pnow,检查是否出现连续相同字符,如果出现,则将最长连续相同字符放入Pnow开始的连续可用位置;如果不出现,则取Snow处字符与结果字符(Pnow-1)到0处的字符对比,使用一个变量作为指示,如果没有找到匹配,该变量值为-1;如果找到,这变量值为匹配值所在位置。使用变量mismatch标识是否匹配到。如果匹配到则处理下一个未处理字符,如果未匹配到,则将该字符装入结果字符数组的Pnow处。
以下代码在xcode 4.6.3上编译通过
#include <stdio.h>
#include <stdlib.h>
typedef enum _bool{
no =0,
yes = 1
}bool;
int main(int argc, const char * argv[])
{
char string[] = "ajsjdjjddddsssapoptfd";
int Snow = 0,Pnow = 0,i=0,j=0;
bool mismatch = yes;
char processed[100];
while(string[Snow]){
j = Snow;
if (string[j]==string[++j]) {
while ((processed[Pnow++]=string[Snow])==string[++Snow]);
}else{
i = Pnow;
while ((--i>=0)&&(processed[i]!=string[Snow])) ;
if (i==-1) {
mismatch = yes;
}else mismatch = no;
if(mismatch){
processed[Pnow++]=string[Snow];
}
++Snow;
}
}
processed[Pnow]='\0';
printf("%s",processed);
return 0;
}
结果:
ajsdjjjjddddssspotf