首页 > 试题广场 >

压缩字符串

[编程题]压缩字符串
  • 热度指数:500 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。

示例1

输入

"aabcccccaaa"

输出

"a2b1c5a3"
示例2

输入

"abbccd"

输出

"abbccd"

说明

"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @return string字符串
     */
    public String compressString (String str) {
        // write code here
        StringBuffer sb = new StringBuffer ();
        int len = str.length();
        int count = 0;
        char ch = str.charAt(0);
        for (int i = 0;i < len; i ++) {
            if (ch == str.charAt(i)) {
                count ++;
            }else {
                sb.append(ch);
                sb.append(count);
                ch = str.charAt(i);
                count = 1;
            }
        }
        sb.append(ch);
        sb.append(count);
        return len > sb.toString().length() ? sb.toString(): str;
    }
}
leetcode上原题

发表于 2021-09-27 11:13:16 回复(0)
public String compressString (String str) {
        if (str.length() < 2) {
            return str;
        }
        char[] arr = str.toCharArray();
        StringBuilder sb = new StringBuilder();
        int count = 1;
        for (int i = 0; i < arr.length - 1; i++) {
            if (arr[i] == arr[i + 1]) {
                count++;
            } else {
                sb.append(arr[i]).append(count);
                count = 1;
            }
            if ((i + 1) == arr.length - 1) {
                sb.append(arr[i]).append(count);
            }
        }
        return sb.length() < str.length() ? sb.toString() : str;
    }

发表于 2021-09-22 20:39:53 回复(0)
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @return string字符串
     */
    string compressString(string str) {
        // write code here
        string cS;
        char elem = str[0];
        int cnt = 1;
        string sub_string;
        for(int i = 1; i < str.size();i++){
            if(elem == str[i]){
                cnt++;
            }
            else{
                sub_string = elem;
                sub_string += to_string(cnt);
                cS += sub_string;
                
                elem = str[i];
                cnt = 1;
                sub_string = "";
            }
        }
        sub_string = elem;
        sub_string += to_string(cnt);
        cS += sub_string;
        if(cS.length()<str.length()){
            return cS;
        }
        else
        {
            return str;
        }
    }
};
发表于 2021-09-04 10:55:10 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @return string字符串
     */
    public String compressString (String str) {
        // write code here
        StringBuilder strBuilder=new StringBuilder();
        char ch=str.charAt(0);//慢指针
        int sum=1;
        for(int i=1;i<str.length();i++){
            char ch2=str.charAt(i);//快指针
            if(ch==ch2){//匹配成功后sum++,然后用continue跳出去,继续执行下面,这样ch就不变,ch2往后加一位,就是个快指针
                sum++;
                continue;
            }
            strBuilder.append(ch).append(sum);
            ch=ch2;
            sum=1;
        }
        strBuilder.append(ch).append(sum);//执行完循环后会剩最后一个字符拼不进去,所有要再手动加一次
        if(strBuilder.length()>=str.length()){//判断长度
            return str;
        }else{
            return strBuilder.toString();
        }
    }
}
我对算法的名称可能不是很了解,我的想法是先做出一个strbuilder构造器,然后做出两个指针,一个慢指针一个快指针,然后看看框了多少个字符,统计下来后拼接到strbuilder里。最后比较的时候看看字符串长短
发表于 2021-08-19 09:32:25 回复(0)