首页 > 试题广场 >

字符串压缩

[编程题]字符串压缩
  • 热度指数:8732 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
对字符串进行 RLE 压缩,将相邻的相同字符,用计数值和字符值来代替。例如:aaabccccccddeee,则可用 3a1b6c2d3e 来代替

数据范围:字符串长度满足

输入描述:
输入为a-z,A-Z的字符串,且字符串不为空,如aaabccccccddeee


输出描述:
压缩后的字符串,如3a1b6c2d3e
示例1

输入

aaabccccccdd

输出

3a1b6c2d
"""
字符串压缩
"""
import sys

if __name__ == "__main__":
    # sys.stdin = open("input.txt", "r")
    s = input().strip()
    count = 1
    ans = ""
    for i in range(1, len(s)):
        if s[i] == s[i - 1]:
            count += 1
        else:
            ans += str(count) + s[i - 1]
            count = 1
    ans += str(count) + s[-1]
    print(ans)

发表于 2019-07-10 11:16:03 回复(0)

比较朴素的解法

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

//相邻的相同字符-用计数值和字符值代替
//几个a几个b几个c

int main(){
    string str, res;
    int ct = 0;
    cin >> str;

    while(str.find_first_not_of(str[0]) != string::npos) {
        char element = str[0];
        int end = str.find_first_not_of(element);
        ct = end;
        res = res + to_string(ct) + element;
        str = str.substr(end);
    }
    int len = str.length();
    res = res + to_string(len) + str[0];
    cout << res << endl;
    return 0;
}

编辑于 2020-05-18 21:34:08 回复(1)
string=input()
list1=list(string)#保留顺序
list2=list(set(string))#去掉重复
list2.sort(key=list1.index)#按原顺序排序
for i in list2:
    count=string.count(i)
    print(str(count)+i,end='')



发表于 2019-12-26 14:04:50 回复(0)
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str;
    while(cin >> str)
    {
        int a = 1;
        for(int i = 1;i<str.size();i++)
        {
            if(str[i]==str[i-1])
            {
                a++;
            }
            else
            {
                cout << a << str[i-1] ;
                a = 1;
            }
        }
        cout << a << str[str.size()-1] << endl;
    }
    return 0;
}

发表于 2019-10-15 22:07:21 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main(){
    string s;
    cin>>s;
    char c = s[0];
    int cnt = 1;
    for(int i=1;i<s.length();i++){
        if(s[i]==c)
            cnt++;
        else{
            cout<<cnt<<c;
            c = s[i];
            cnt = 1;
        }
    }
    cout<<cnt<<c<<endl;
    return 0;
}

发表于 2019-11-26 23:46:32 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main(){
    int num[123]={0};
    char cur,pre=cin.get();
    num[pre-65]++;
    while((cur=cin.get())!='\n'){
        num[cur-65]++;
        if(cur!=pre)
            cout<<num[pre-65]<<pre;
        pre=cur;
    }
    cout<<num[pre-65]<<pre;
}

发表于 2019-09-19 15:33:20 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    cin>>s;
    int n=1;
    for(int i=1;i<s.size();i++)
    {
        if(s[i]==s[i-1])
            n++;
        else
        {
            cout<<n<<s[i-1];
            n=1;
        }
    }
    cout<<n<<s[s.size()-n];
    return 0;
}

发表于 2019-07-01 20:01:12 回复(0)
/*
遍历一遍即可。
*/
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.next();
        char[] str = s.toCharArray();
        int len = s.length();
        int cnt = 0;
        for (int i = 0; i < len; i++) {
            cnt++;
            if (i == len - 1 || str[i] != str[i + 1]) {
                System.out.print(cnt + "" + str[i]);
                cnt = 0;
            }
        }
    }
}

发表于 2019-06-29 10:59:23 回复(1)
s=input()
s1=set(s)
res=''
for i in s1:
    res=res+str(s.count(i))+i
print(res)


发表于 2019-11-01 14:36:51 回复(0)
s = input()
res = ""
n = 1
for i in range(1,len(s)):
    if s[i] == s[i-1]:
        n += 1
    else:
        res += str(n) + s[i-1]
        n = 1
res += str(n) + s[-1]
print(res)

发表于 2019-07-27 08:59:07 回复(0)
#include <bits/stdc++.h>
using namespace std;
 
int main()
{
    string str;
    getline(cin, str);
    for(int i = 0; i < str.length(); i++)   //遍历字符串
    {
        int cnt = 1;   //用来记录重复字符数量
        while(str[i] == str[i+1])   //判断是不是字符串中的重复字符
        {
            i++;
            cnt++;
        }
        cout << cnt << str[i];   //压缩后的形式,先输出重复字符的个数+1,再输出重复字符
    }
    return 0;
}

编辑于 2019-06-29 14:21:56 回复(0)
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function () {
    // Write your code here
    let line = await readline()
    let str=''
    let arr=[]
    for(let i=0;i<line.length+1;i++){
        if(arr.length&&arr[0]===line[i]||arr.length===0){
            arr.push(line[i])
        }else{
             str+=arr.length+arr[0]
             arr=[line[i]]
        }
    }
    console.log(str)
    }()


const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function () {
    // Write your code here
    let line = await readline()
    let str=''
    for(let i=0;i<line.length;i++){
        let cnt=1
      while(line[i]===line[i+1]){
        i++
        cnt++
      }
      str+=cnt+line[i]
    }
    console.log(str)
    }()



编辑于 2024-01-05 23:59:26 回复(0)
package main

import (
    "fmt"
    "strconv"
    "os"
    "bufio"
)

var in=bufio.NewReader(os.Stdin)

func main() {
    var s string
    fmt.Fscan(in,&s)
    ans:=""
    var pre byte
    cnt:=0
    for i,ch:=range []byte(s){
        if i==0{
            pre=ch
            cnt=1
        }else{
            if ch==pre{
                cnt++
            }else{
                ans+=strconv.Itoa(cnt)+string(pre)
                pre=ch
                cnt=1
            }
        }
    }
    ans+=strconv.Itoa(cnt)+string(pre)
    fmt.Print(ans)
}

发表于 2023-03-18 01:48:40 回复(0)
a = input()
output = ""
mid = a[0]
cout = 0
while True:
    if len(a)!=0:
        cout += 1
        a = a[1:]
        if len(a)==0:
            output = output+str(cout)+mid
        elif a[0] != mid and a[0] != "":
            output = output+str(cout)+mid
            mid = a[0]
            cout = 0
    else:
        break
print(output)
发表于 2022-03-19 21:56:05 回复(0)
# 基于Python利用双指针实现
s = input()
res = ""
i = j = 0
while i <= j < len(s):
    while j < len(s) and s[j] == s[i]:
        j += 1
    res = res + str(j-i) + s[i]
    i = j
print(res)

发表于 2021-07-13 21:08:14 回复(0)
#include<iostream>
#include<string>
int main()
{
    std::string s;
    while(std::cin>>s)
    {
        
            int a[52]={0};
            for(int i=0;i<s.size();i++)
            {
                if(s[i]>='a'&&s[i]<='z')a[s[i]-'a']++;
                if(s[i]>='A'&&s[i]<='Z')a[s[i]-'A'+26]++;
            
            }
            for(int i=0;i<s.size();i++)
            {
                if(s[i]>='a'&&s[i]<='z'&&a[s[i]-'a']!=0)
                {
                    
                    std::cout<<a[s[i]-'a']<<s[i];
                    a[s[i]-'a']=0;
                }
                if(s[i]>='A'&&s[i]<='Z'&&a[s[i]-'A'+26]!=0)
                {
                    
                    std::cout<<a[s[i]-'A'+26]<<s[i];
                    a[s[i]-'A']=0;
                }
            }
            std::cout<<std::endl;
        
        
    }
    return 0;
}
发表于 2020-09-08 15:41:35 回复(0)
#include<iostream>
#include<unordered_map>
using namespace std;
int main()
{
    string S;
    cin>>S; 
    unordered_map<char, int> hash_map;
    
    for(auto it:S)
    {
        if(hash_map.find(it)!=hash_map.end())
        {
            hash_map[it]++;
        }
        else
        {
            hash_map.insert(pair<char, int>(it,1));
        }
    }
    string res;
    for(auto it:hash_map){
        string tmp=to_string(it.second)+it.first;
        res=tmp+res;
    }
    cout<<res;
}

哈希表
发表于 2020-08-14 02:30:02 回复(0)
char = input() #输入字符串

se = set(char)

ls = list(se)

nul = []
for i in range(len(se)):
    num = char.count(ls[i])
    nul.append(num)
    nul.append(ls[i])

nu = [str(i) for i in nul]

print("".join(nu))

发表于 2020-06-27 14:46:37 回复(0)
import sys
in_str = sys.stdin.readline().strip()

aa={}
aa[0]=in_str[0]
idx = 1
for i in range(len(in_str)-1):
    if in_str[i]!=in_str[i+1]:
        aa[idx] = in_str[i+1]
        idx+=1
res = ''
for value in aa.values():
    res+=str(in_str.count(value))
    res+=value
print(res)

发表于 2020-06-11 15:45:36 回复(0)
while True:
    try:
        s = '.'
        s = s + input()
        s = s + '.'
        ss = ''
        c = 1
        for i in range(1, len(s)-1):
            if s[i] == s[i-1] and s[i] == s[i+1]:
                c = c + 1
            if s[i] == s[i-1] and s[i] != s[i+1]:
                c = c + 1
                ss = ss + str(c) + s[i]
                c = 1
            if s[i] != s[i-1] and s[i] != s[i+1]:
                c = 1
                ss = ss + str(c) + s[i]
        print(ss)
    except:
        break

发表于 2020-05-04 10:13:20 回复(0)