如何使用C语言压缩字符串并替换重复项为它们的数量?

4
我有一个大字符串 char myStr="AAAABBBCCCCCCDDDEFGHHIJJ"。 我要将这个字符串传递给我的字符串压缩函数,该函数应以以下格式返回字符串 myStr ="A4B3C6D3EFGH2IJ2"。 此外,新的字符串替换应在同一传递的字符串中进行。 不能创建临时数组。
下面是我的函数,我无法弄清楚如何删除重复项并在同一字符串中用其计数进行替换。
 #include<stdio.h>
 #include<string.h>


 char* StrCompress(char myStr[])
 {
char *s = myStr;
int len = strlen(myStr);
char *in = myStr;
int count =0;
int i=0;


while(*(s) != '\0')
{
    if(*(s)==*(s+1))
    {
        count++;

        if(count == 1)
        {
            in = s;
        }
        s++;

    }
    else
    {
        //myStr[count-1]=count;
        memcpy(in+1,s+1,count);
        s=in;
        count =0;

    }
    i++;
}

return myStr;



}

int main(){

char myStr[] ="AAAABBBCCCCCEEFGIIJJJKLMNNNNOOO";

printf("Compressed String is : %s\n",StrCompress(&myStr));

return 0;

}

2
看起来你正在尝试执行一种行程长度编码(RLE),但是计数+数据元组被颠倒了。这正确吗?另外,我们可以假设你的字符串从不包含数字,因为它们会完全破坏你的算法? - WhozCraig
13个回答

0
void gen_compressed_str(string str){ 
        int len = str.length(); 
        for (int i = 0; i < len; i++) { 
  
        int count = 1; 
        while (i < len - 1 && str[i] == str[i + 1]) { 
            count++; 
            i++; 
        }
        if (count == 1){
          cout << str[i];
        }
        else{
          cout << str[i]<<count;
        }
         
    } 
    cout<<endl;
}

0

这是另一种使用ES6的解决方案:

    // aaeezaa : a4e2z1
    function compressString(str) {
        const obj = {};
        const sortedArr = [...str].sort();

        for(i = 0; i<sortedArr.length; i++) {
            let c = 1;

            while((sortedArr[i] === sortedArr[i+1]) && sortedArr[i+1]) {
                c++;
                i++;
            }

            obj[sortedArr[i]] = c;
        }

        return Object.keys(obj).reduce((compressedStr, k) => compressedStr + k + obj[k], '');
    }

0
#include<stdio.h>
#include<conio.h>

char* compress(char* str);

int main(){
  clrscr();
  char str[1000];
  scanf("%[^\n]s", str);
  char* s = compress(str);
  printf("\n%s", s);
  getch();
  return 0;
}

char* compress(char* str){
 char* s = str;
 int count = 1;
 char str2[1000] = "\0";
 char* n = str2;
 while(*(s) != '\0'){
    if(count == 1){
      *n = *s;
      n++;
    }
    if(*(s) == *(s+1)){
      count++;
      s++;
    }
    else{
     *n = '0' + count;
     n++;
     count = 1;
     s++;
    }
}
 return str2;
}

1
欢迎来到Stack Overflow!感谢您提供这段代码片段,它可能会在短期内提供一些有限的帮助。通过展示为什么这是一个好的解决方案,适当的解释将极大地提高其长期价值,并使其对未来具有其他类似问题的读者更有用。请编辑您的答案以添加一些解释,包括您所做的假设。 - Toby Speight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接