01.06 字符串压缩

01.06 字符串压缩

1、题目

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

1)示例1

输入:"aabcccccaaa"
 输出:"a2b1c5a3"

2)示例2

输入:"abbccd"
输出:"abbccd"
解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。

2、初步作答

2.1 思路

  • 判断字符串是否为空,空字符串不能压缩
  • 依次读取字符串,相同字符,则数量加 1
  • 比较压缩的字符串与原字符串长度,若未减少则输出原字符串

2.2 做法

  • 判断字符串是否为空,为空直接返回原字符串
  • 创建一个二维数组,字符串长度为行数,列数为 2
    • 遍历字符串,扫描到新的字符直接放入第一列
    • 每次扫描到与上一行相同的字符,第二列加一
  • 建立 StringBuffer 类型的字符串,插入字符形成新的字符串
  • 比较字符串长度,输出长度较小的那一个

2.3 代码

public class String_compression {
    public static void main(String[] args) {
        String s1;
        s1 = "aabbbcccaaaa";
        System.out.println(s1);
        s1 = compressString(s1);
        System.out.println(s1);
    }

    public static String compressString(String S) {
        if(S.isEmpty()){
            return S;
        }
        char[] Sarr = new char[S.length()];//创建数组存储压缩字符串的数据
        int[] Snum = new int[S.length()];//压缩后字符的个数
        StringBuffer s =new StringBuffer();//存储压缩后的字符串
        char Sc;
        int l = -1;
        for (int i = 0; i < S.length(); i++) {//将压缩数据存入数组Sarr中
            Sc = S.charAt(i);
            if(l == -1){
                l++;
                if(Sc != Sarr[l]){
                    Sarr[l] = Sc;
                    Snum[l] = Snum[l] + 1;
                }else{
                    Snum[l] = Snum[l] + 1;
                }
            }else{
                if(Sc != Sarr[l]){
                    l++;
                    Sarr[l] = Sc;
                    Snum[l] = Snum[l] + 1;
                }else{
                    Snum[l] = Snum[l] + 1;
                }
            }
        }
        for (int i = 0; i < l+1; i++) {
            s.append(Sarr[i]);
            s.append(Snum[i]);
        }
        String ss = s.toString();
        if(ss.length() < S.length()){
            return ss;
        }else{
            return S;
        }
    }
}

执行用时:6 ms, 在所有 Java 提交中击败了28.80%的用户

内存消耗:41.3 MB, 在所有 Java 提交中击败了11.17%的用户

通过测试用例:32 / 32

3、其余解法

力扣官方代码

class Solution {
    public String compressString(String S) {
        if (S.length() == 0) { // 空串处理
            return S;
        }
        StringBuffer ans = new StringBuffer();
        int cnt = 1;
        char ch = S.charAt(0);
        for (int i = 1; i < S.length(); ++i) {
            if (ch == S.charAt(i)) {
                cnt++;
            } else {
                ans.append(ch);
                ans.append(cnt);
                ch = S.charAt(i);
                cnt = 1;
            }
        }
        ans.append(ch);
        ans.append(cnt);
        return ans.length() >= S.length() ? S : ans.toString();
    }
}
上一篇:使用redis实现curd


下一篇:LinQ简单增删改查CURD更新update字段语法