题目
字符串原地压缩。题目描述:“eeeeeaaaff"
压缩为 "e5a3f2",请编程实现。
思想
首先想到最简单的方法是创建一个数组,一次遍历就可以将原字符串压缩。时间复杂度O(N),空间复杂度O(N)。但这种方法不符合题意,题目要求原地压缩。那么空间复杂度应该是O(1)。
如果使用原地压缩,最麻烦的就是移动数据。如果不用移动数据,就能达到时间复杂度O(N),空间复杂度为O(1)。
不移动数据,可以增加一个标记。标记压缩后的字符串的长度。这样就可以一个数组两个用途了。
问题
如下的字符串“abcccc”,压缩后a1b1c4。另外字符串“abc”压缩后成了“a1b1c1”。这两种情况下,上述方法就不好用了。尤其第二种情况下,压缩后的数组比压缩前还长。 对于这两种情况,因为题目没有规定长度为1的情况的处理情况,不如咱们假设如果长度为1的字符,后面不用1。这样就简化了问题。
另外,还有一个问题,就是在其中一个字符长度大于9时的处理方法。如果长度大于9,需要获取到长度位数,然后将长度数字copy到String上。下面实现的代码没有考虑这种情况。
代码
/**
* 原地压缩
* 字符串原地压缩。题目描述:“eeeeeaaaff" 压缩为 "e5a3f2",请编程实现。
* @author ajwang
*
*/
public class PlaceCompress {
public static void main(String[] args) {
char[] string = "aabbccddeeffg".toCharArray();
int end = placeCompress(string);
System.out.println(String.copyValueOf(string,0,end+1));
}
public static int placeCompress(char[] string) {
int length = string .length;
int compressLength = 0;
int count = 1;
for(int i=1;i<length;i++) {
if(string[i]==string[compressLength]) {
count++;
} else {
if(count!=1) {
compressLength++;
string[compressLength]=(char) ('0'+count%10);
}
compressLength++;
string[compressLength]= string[i];
count = 1;
}
//当处理结束时,需要计算一下最后一个字符出现的次数
if(i==length-1) {
if(count!=1) {
compressLength++;
string[compressLength]=(char) ('0'+count);
}
}
}
return compressLength;
}
}
分享到:
相关推荐
运行程序之后输入任意的字符串,将字符串转化成二进制数字字符串,然后利用LZ78算法实现对二进制字符串压缩解压,最后再恢复原来的字符串
主要介绍了C语言字符串快速压缩算法代码,将字符串中连续出席的重复字母进行压缩,其主要的压缩字段的格式为”字符重复的次数+字符”。有需要的小伙伴参考下吧。
通过键盘输入一串小写字母(a~z)组成的字符串,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。 要求实现...
java压缩字符串
快速字符串压缩[快速字符串压缩]-精品源代码
Java 字符串压缩和文件压缩代码,详细说明参考博客地址: https://blog.csdn.net/zhangmingziliao/article/details/77414760
关于经典算法--压缩字符串(将字符串内连续重复出现的字符进行压缩),个人的想法
本文实例讲述了C语言字符串原地压缩的实现方法,对于学习字符串操作的算法设计有不错的借鉴价值。分享给大家供大家参考。具体方法如下: 字符串原地压缩示例: “eeeeeaaaff”压缩为”e5a3f2” 具体功能代码如下: /...
C# 3种方法实现字符串的压缩与解压操作.
在vb程序将字符串转为vb代码执行,非原创,收集自网络
华为机考2017:字符串解压缩算法,通过率100%
C语言JSON字符串生成代码 C语言JSON字符串生成代码 C语言JSON字符串生成代码 C语言JSON字符串生成代码 C语言JSON字符串生成代码 C语言JSON字符串生成代码 C语言JSON字符串生成代码 C语言JSON字符串生成代码 C语言...
LZW就是通过建立一个字符串表,用较短的代码来表示较长的字符串来实现压缩. LZW编码是基于1977年开发的LZ77算法为基础的。LZ77编码算法的核心是查找从前向缓冲存储器开始的最长的匹配串。LZW压缩算法的基本原理:...
下面是用C语言实现不使用是strcat 函数实现连接两个字符串的功能。 源代码: #include void constring(char s[],char t[],char q[]); //函数声明 int main(void) { char s[100]; char q[100]; char t[200]; ...
字符串的压缩和解压,java语言编写,zip实现,代码编写
字符串的压缩和解压
html代码编写的网页,可以快速查找,替换掉需要替换的字符串,多个字符串一次性替换完成, 简单方便
对字符串进行压缩解密。 将很长的一段字符串,加密后缩短,并且是可逆的,可通过解码算法还原字符串。
C语言实现数据结构字符串部分