使用允许的有限字符压缩java中的字符串

使用允许的有限字符压缩java中的字符串,java,Java,我的一个朋友得到了这个。此外,他还被告知可以假设字符是字母a到z(大写或小写)。我写了以下内容,但我不知道如何使用关于字符串包含的有限字符(a到z)的假设。我是在没有意识到的情况下使用这个假设,还是我可以利用它 public static String compress(String str){ int count = 1; char c = str.charAt(0); StringBuffer result = new StringBuffer(); f

我的一个朋友得到了这个。此外,他还被告知可以假设字符是字母a到z(大写或小写)。我写了以下内容,但我不知道如何使用关于字符串包含的有限字符(a到z)的假设。我是在没有意识到的情况下使用这个假设,还是我可以利用它

  public static String compress(String str){
    int count = 1;
    char c = str.charAt(0);
    StringBuffer result = new StringBuffer();

    for (int i = 1; i < str.length();i++){
      if (str.charAt(i) == c){
        count++;
      }
      else{
        String to_add = c + String.valueOf(count);
        result.append(to_add);
        count = 1;
        c = str.charAt(i);
      }
    }
    // last character
    String to_add = c + String.valueOf(count);
    result.append(to_add);

    String result_str = result.toString();

    // Check whether the compressed string is
    // actually smaller than the original one
    if (result_str.length() < str.length()){
      return result_str;
    }
    else{
      return str;
    }
  }
公共静态字符串压缩(字符串str){
整数计数=1;
字符c=str.charAt(0);
StringBuffer结果=新的StringBuffer();
对于(int i=1;i
'a'到'Z'是
2*26=52
不同的字符,适合6位(
2^6=64
)。你可以把代码点打包成六重奏


OTOH(您所编码的内容)仅适用于重复。如果你有像
abcde
这样的输入,它会变成
1a1b1c1d1e
或类似的东西,效率很低,你很难称之为压缩。

将每个字符分配给一个数字,例如a=1,z=26。所以,要表示这26个字符,至少需要5位

现在可以使用2个字节(16位)来存储一个三元组字符。这需要比每个字符(如果是ascii)初始1字节少1/3字节。要存储三组字符,请从字节中读取位(例如从左到右)

  • 第一个字节的前五位代表第一个字符
  • 第一个字节的后三位与第二个字节的前两位相连,表示第二个字节
  • 第二个字节的下五位代表第三个字符
  • 还有一位(忽略它)
  • *要稍微提高压缩大小,如果字符串的长度%3=1,那么对于字符串的最后一个字符,您只能使用一个字节,因为您没有另一个三元组

    **您可以使用post中的算法获得是否在字节上设置了特定位,即:

    public byte getBit(byte b, int position)
    {
       return (b >> position) & 1;
    }
    
    ***您可以使用post中的算法将位设置为字节,这些算法是:

    设置位(将其设置为1)


    b=b |(1)知道有限的字符a-z(26)可以在26字节中编码32个字符,而无需使用更高级的压缩算法。混合大小写的输出应该是什么?比如aaaabbbc==5A3B2C?@user1428716它应该是A3B3C2
    
    b = b | (1 << position);
    
    b = b & ~(1 << position);