`
jbm3072
  • 浏览: 211257 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[字符串原地压缩][代码实现]

阅读更多

题目

字符串原地压缩。题目描述:“eeeeeaaaff" 压缩为 "e5a3f2",请编程实现。

 

思想

 

首先想到最简单的方法是创建一个数组,一次遍历就可以将原字符串压缩。时间复杂度O(N),空间复杂度ON)。但这种方法不符合题意,题目要求原地压缩。那么空间复杂度应该是O1)。

 

如果使用原地压缩,最麻烦的就是移动数据。如果不用移动数据,就能达到时间复杂度ON),空间复杂度为O1)。

 

不移动数据,可以增加一个标记。标记压缩后的字符串的长度。这样就可以一个数组两个用途了。

 

问题

如下的字符串“abcccc”,压缩后a1b1c4。另外字符串“abc”压缩后成了“a1b1c1”。这两种情况下,上述方法就不好用了。尤其第二种情况下,压缩后的数组比压缩前还长。 对于这两种情况,因为题目没有规定长度为1的情况的处理情况,不如咱们假设如果长度为1的字符,后面不用1。这样就简化了问题。

 

另外,还有一个问题,就是在其中一个字符长度大于9时的处理方法。如果长度大于9,需要获取到长度位数,然后将长度数字copyString上。下面实现的代码没有考虑这种情况。

 

 

代码

 

/**
 * 原地压缩
 * 字符串原地压缩。题目描述:“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;
	}
}
 

 

1
0
分享到:
评论

相关推荐

    C语言字符串原地压缩实现方法

    下面我们将详细讲解如何实现C语言中的字符串原地压缩。 首先,我们需要理解字符串的基本概念。在C语言中,字符串是以空字符'\0'作为结束标志的字符数组。例如,"eeeeeaaaff"实际上是一个长度为10的字符数组,其中第...

    各种排序与字符串匹配的例子

    至于压缩包子文件"myGametest02",可能是包含了各种排序与字符串匹配算法实现的代码文件,通过查看和分析这些代码,可以进一步学习和理解这些算法的实际运用。在代码交流和学习中,我们可以发现并修复潜在的错误,...

    压缩字符串(双指针)1

    题目要求在给定的字符数组中,通过原地算法实现字符串的压缩...5. 进阶优化:在有限的空间限制下,如何设计算法以实现原地压缩。 理解和掌握这些知识点对于解决类似的问题至关重要,尤其是在空间复杂度有限的条件下。

    10 深入学习字符串.zip

    理解字符串操作的底层原理,如字符串缓冲区、原地算法等,可以帮助我们编写更高效的代码。 8. 安全性 在处理用户输入时,字符串安全不容忽视。SQL注入、XSS攻击等都与字符串处理有关。了解如何转义特殊字符,避免...

    算法 第4版 高清中文版

    算法(第4版)》是Sedgewick之巨著,与高德纳TAOCP一脉相承,是算法领域经典的参考书,涵盖所有程序员必须掌握的50种算法,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行了...

    《算法》中文版,Robert Sedgewick,塞奇威克

    5.2.5 应该使用字符串符号表的哪种实现 5.3 子字符串查找 5.3.1 历史简介 5.3.2 暴力子字符串查找算法 5.3.3 Knuth-Morris-Pratt子字符串查找算法 5.3.4 Boyer-Moore字符串查找算法 5.3.5 Rabin-Karp指纹字符...

    算法-单词排序(信息学奥赛一本通-T1185)(包含源程序).rar

    1. **字符串处理**:首先,我们需要掌握如何处理字符串,包括分割字符串成单词、检查单词的边界以及比较单词。这涉及到字符串的基本操作,如`split()`函数用于按空格分隔字符串,以及字符串的比较操作。 2. **排序...

    算法,4th,塞奇威克 (Robert Sedgewick)韦恩 (Kevin Wayne), 谢路云 译.azw3

    5.2.5 应该使用字符串符号表的哪种实现 5.3 子字符串查找 5.3.1 历史简介 5.3.2 暴力子字符串查找算法 5.3.3 Knuth—Morris—Pratt子字符串查找算法 5.3.4 Boyer—Moore字符串查找算法 5.3.5 Rabin—Karp指纹...

    Python练习程序_Python倒叙_

    Python中,可以简单地通过切片操作来实现字符串的倒序。例如,如果你有一个字符串`str = "Hello"`,你可以使用`str[::-1]`来获取它的倒序,结果为`"olleH"`。这适用于所有字符串,包括那些在`倒叙.py`文件中可能...

    ACM常用代码(经典)

    - KMP算法:快速匹配字符串,避免了多余的回溯,提高了字符串查找效率。 - Rabin-Karp算法:通过哈希函数快速检测子串是否存在,同时处理多个模式串匹配。 - Manacher's Algorithm:处理回文串的查找,可以在线性...

    leetcode常用算法java代码

    这个名为“leetcode常用算法java代码”的压缩包文件很可能包含了使用Java语言实现的LeetCode上热门或基础算法问题的解法。让我们深入探讨一下这些常见算法及其在Java中的实现。 1. **排序算法**: - **冒泡排序**...

    02 HeapString.rar

    《严蔚敏数据结构与算法实现》是一本深入讲解数据结构和算法的经典教材,其中"HeapString"部分主要探讨了堆排序(Heap Sort)和基于堆的数据结构——优先队列(Priority Queue)以及它们在字符串处理中的应用。...

    SP.NET中常用的26个优化性能方法

    - **StringBuilder类**:对于大量字符串操作,使用StringBuilder而非String类,因为它允许在原地修改字符串,减少对象创建,从而提高性能。 3. **配置文件优化**: - **身份验证配置**:根据实际需求关闭不必要的...

    程序员数据结构笔记.doc

    线性表数据结构定义为一个包含数据数组和长度的结构体,这使得我们可以方便地实现线性表的各种操作,如模式匹配、字符串相加、子串获取等。对于稀疏矩阵的转置,有多种实现方式,其中一种巧妙的方法是通过转换存储...

    数据结构培训笔记

    根据给定的“数据结构培训笔记”的标题、描述、...- **字符串处理**:例如字符串相加、求子串等操作。 以上知识点涵盖了数据结构培训中的一些重要内容,希望能够帮助读者更好地理解和掌握数据结构的相关概念和技术。

    数据结构笔记

    - **代码实现**:提供了相应的C语言示例代码。 ### 结论 数据结构的学习不仅在于掌握各种结构的定义和操作,更重要的是培养解决问题的能力,学会如何分析问题并选择合适的数据结构和算法来高效地解决问题。通过对...

    数据结构笔记.pdf

    数组是相同类型数据的集合,存储在连续的内存空间中,而字符串是特殊的线性表,通常以字符序列的形式存在。 3. 数组:数组是数据结构的基础,存储在一维或多维的连续内存空间中。数组地址计算通过下标和元素大小...

    程序员数据结构学习笔记

    线性数据结构包括线性表、栈、队列、数组和字符串。线性表是一种有序的数据集合,可以是动态或静态的,如C++中的vector或Java中的ArrayList。栈遵循“后进先出”原则,常用于递归和表达式求值。队列则遵循“先进先出...

    数据结构笔记文档格式

    - **字符串**:字符串是特殊的线性表,由字符组成。字符串的处理包括模式匹配,如朴素算法和KMP算法(KMP不作为考核内容)。 - **特殊矩阵**:对于某些特定类型的矩阵,如三对角矩阵,可以使用压缩存储来节省空间。...

Global site tag (gtag.js) - Google Analytics