关于字符串压缩方法合集(java实现)

问题一

利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。
给定一个string iniString为待压缩的串(长度小于等于10000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。

解决方法

使用StringBuilder
StringBuilder 解决大量拼接字符串时产生很多中间对象问题而提供的类
提供append和add方法,可以将字符串添加到已有序列的末尾或指定位置
例:str =“aaaabbccccddeaaa” 压缩为"4a2b4c2d1e3a"

代码
public String zipString(String iniString) {
		
		/**
		 * 字符串压缩 使用StringBuilder
		 * StringBuilder 解决大量拼接字符串时产生很多中间对象问题而提供的类
		 * 提供append和add方法,可以将字符串添加到已有序列的末尾或指定位置
		 * 例:str ="aaaabbccccddeaaa" 压缩为"4a2b4c2d1e3a"
		 * **/
		StringBuilder sb = new StringBuilder();
		int len = iniString.length();
		int low = 0, high = 0;
		int count = 0;
		char c = ' ';
		
		while(low < len){
			high = low;
			c = iniString.charAt(low);
			while((high < len) && (iniString.charAt(high) == c)){
				high++;
			}
			count = high - low;
			sb.append(c);
			sb.append(count);
			low = high;
		}
		
		return (sb.toString().length() < len) ? sb.toString() : iniString;
	}

版权声明:本文为CSDN博主「奕起学习」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_29606255/article/details/78477517

问题二

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-compression

443.压缩字符串

给定一组字符,使用原地算法将其压缩。
压缩后的长度必须始终小于或等于原数组长度。
数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。
在完成原地修改输入数组后,返回数组的新长度

示例 1:

输入:
[“a”,“a”,“b”,“b”,“c”,“c”,“c”]

输出:
返回6,输入数组的前6个字符应该是:[“a”,“2”,“b”,“2”,“c”,“3”]

说明:
"aa"被"a2"替代。"bb"被"b2"替代。"ccc"被"c3"替代。

示例 2:

输入:
[“a”]

输出:
返回1,输入数组的前1个字符应该是:[“a”]

说明:
没有任何字符串被替代。

示例 3:

输入:
[“a”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”]

输出:
返回4,输入数组的前4个字符应该是:[“a”,“b”,“1”,“2”]。

说明:
由于字符"a"不重复,所以不会被压缩。"bbbbbbbbbbbb"被“b12”替代。
注意每个数字在数组中都有它自己的位置。

解决方法

此题要求使用原地算法求解,即将压缩结果存在原chars[]数组中.
使用双指针即可求解此题.这里我们称由相同字符组成的字符串为相同字符序列.
指针t指示已压缩的结果的末尾,指针i指示未压缩字符串的开头.
遇到相同的字符,指针i便向后滑动,直到遇到不同字符.指针i滑动的距离即为相同字符序列的长度.

代码
public int compress(char[] chars) {
		
		//设置指针
		int t = 0;
        int i = 0;
        
        //遍历字符串
        while (i < chars.length && t < chars.length) {
        	
        	//取相同字符序列的首字符存下
            chars[t++] = chars[i];
            //记录相同字符序列首元素位置
            int temp = i;
            while (i < chars.length && chars[i] == chars[t-1])
            	//i指针滑动到相同字符序列末尾的下一个位置
                i++;
            //若相同字符序列长度大于1
            if(i - temp > 1){
            	
            	//向结果中加入相同字符序列的长度的字符形式
            	//String.valueOf 将基本数据类型转化为String
                for(char c : String.valueOf(i - temp).toCharArray()){
                    chars[t++] = c;
                }
            }
        }
        //t即为已压缩的结果的长度
        return t;
    }

作者:FlyChenKai
链接:https://leetcode-cn.com/problems/two-sum/solution/shuang-zhi-zhen-fa-qiu-ya-suo-zi-fu-chuan-java-by-/

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,需要用Java的Base64类将Base64字符串解码成byte数组,然后将byte数组通过GZIP进行压缩,最后再把压缩后的byte数组通过Base64类编码成压缩后的Base64字符串。以下是示例代码: ```java import java.util.zip.Deflater; import java.util.zip.Inflater; import java.util.Base64; public class Base64Compression { public static String compress(String base64String) { byte[] decodedBytes = Base64.getDecoder().decode(base64String); byte[] compressedBytes = compressBytes(decodedBytes); return Base64.getEncoder().encodeToString(compressedBytes); } public static String decompress(String compressedBase64String) { byte[] compressedBytes = Base64.getDecoder().decode(compressedBase64String); byte[] decompressedBytes = decompressBytes(compressedBytes); return Base64.getEncoder().encodeToString(decompressedBytes); } private static byte[] compressBytes(byte[] data) { Deflater deflater = new Deflater(); deflater.setInput(data); deflater.finish(); byte[] buffer = new byte[data.length]; int compressedSize = deflater.deflate(buffer); byte[] compressedData = new byte[compressedSize]; System.arraycopy(buffer, 0, compressedData, 0, compressedSize); return compressedData; } private static byte[] decompressBytes(byte[] data) { Inflater inflater = new Inflater(); inflater.setInput(data); byte[] buffer = new byte[data.length * 2]; int decompressedSize; try { decompressedSize = inflater.inflate(buffer); } catch (Exception e) { throw new RuntimeException("Failed to decompress data", e); } byte[] decompressedData = new byte[decompressedSize]; System.arraycopy(buffer, 0, decompressedData, 0, decompressedSize); return decompressedData; } } ``` 可以使用以下代码测试: ```java String base64String = "SGVsbG8gV29ybGQh"; String compressedBase64String = Base64Compression.compress(base64String); System.out.println(compressedBase64String); // 输出: "eJwrSS0uyczPAQAAP//I1g==" String decompressedBase64String = Base64Compression.decompress(compressedBase64String); System.out.println(decompressedBase64String); // 输出: "SGVsbG8gV29ybGQh" ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值