字符串压缩排序

来源:互联网 发布:中国式父母 知乎 编辑:程序博客网 时间:2024/06/06 12:38

题目要求:给定一个字符串,统计连续字符出现的次数,并对其排序输出。

例如:输入"aabbccAAA",输出"A3a2b2c2";

 

我所采用的方法是先对整个字符串统计连续相同的字符出现的次数,将其存入数组,然后对数组中的字符进行排序,并将

排序后的字符和对应的出现的次数存入输出数组中。

 

下面是参考代码:

#include<iostream>
#include <string>
using namespace std;

void zipsort(char *str,int len,char *res);
int quick(char *str,int len);
int main()
{
 char p1[]="aabbcccAAA";
 int len=strlen(p1);
 char p2[50]="";

 zipsort(p1,len,p2);
 return 0;
}

void zipsort(char *str,int len,char *res)
{
 if (str==NULL || len<=0)
 {
  return;
 }

 int cnt=1;
 char *p1=str;
 char p2[50]="";
 int i=0,j=0;

 //找到相同字符出现的次数,并将字符和其出现次数一并存入数组
 cout <<"p2:\n";
 while(i<len)
 {
  if (p1[i]==p1[i+1])
  {
   cnt++;
   i++;
  }
  else
  {
   p2[j]=p1[i];
  // cout <<p2[j];
   j++;
   p2[j]=cnt+'0';
  // cout <<p2[j];
   j++;
   cnt=1;
   i++;
  }
 }
 p2[j]='\0';
 for (i=0;i<j;i++)
 {
  cout<<p2[i];
 }

 //找出上面数组中存入的字符,并对其进行排序
 i=0;
 char p3[50]="";
 int k=0;
 cout <<"\np3:\n";
 while(i<j)
 {
  if(i%2==0)  //i为偶数
  {
   p3[k]=p2[i];
  // cout <<p3[k];
   i+=2;
   k++;
  }
/*
  else
   i++;*/

 }
 p3[k]='\0';
 for(i=0;i<k;i++)
 {
  cout <<p3[i];
 }
 cout <<"\nnew sort p3:\n";
 int l=0;
 for (i=0;i<k-1;i++)
 {
  for (l=i+1;l<k;l++)
  {
   if (p3[l]<p3[i])
   {
    char s=p3[i];
    p3[i]=p3[l];
    p3[l]=s;
   }
  }
 }
 for(i=0;i<k;i++)
  cout <<p3[i];

/*
 cout <<"\np2:\n";
 for (i=0;i<j;i++)
 {
  cout<<p2[i];
 }
*/

 

 cout <<"\nresult:\n";
 int n=0,m=0;
 for (i=0;i<k;i++)
 {
   while(n<j && m<j)
   {
    if(p3[i]==p2[m])
    {
     res[n]=p2[m];
     //cout<<res[n];
     n++;
     res[n]=p2[m+1];
     //cout<<res[n];
     n++;
     m=0;
     break;
    }
    else
     m++;
   }
 }
 res[n]='\0';
 for (i=0;i<j;i++)
 {
  cout<<res[i];
 }
 cout <<endl;
}

 

原创粉丝点击