加载中...
面试题 01.06-字符串压缩(Compress String LCCI)
发表于:2021-12-03 | 分类: 简单
字数统计: 758 | 阅读时长: 3分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/compress-string-lcci

英文原文

Implement a method to perform basic string compression using the counts of repeated characters. For example, the string aabcccccaaa would become a2blc5a3. If the "compressed" string would not become smaller than the original string, your method should return the original string. You can assume the string has only uppercase and lowercase letters (a - z).

Example 1:

Input: "aabcccccaaa"
Output: "a2b1c5a3"

Example 2:

Input: "abbccd"
Output: "abbccd"
Explanation: 
The compressed string is "a1b2c2d1", which is longer than the original string.

 

Note:

  1. 0 <= S.length <= 50000

中文题目

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

示例1:

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

示例2:

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

提示:

  1. 字符串长度在[0, 50000]范围内。

通过代码

高赞题解

这是一道考验基本功的题目。

这道题考察的第一个点是如何找到字符串中连续的字符。方法是使用双指针,移动两个下标 ij。过程如下图所示:

process

这道题考察的第二个点是构建字符串的时间复杂度。例如在 C++ 中,res += sres = res + s 的含义是不一样的。前者是直接在 res 后面添加字符串;后者是用一个临时对象计算 res + s,会消耗很多时间和内存。

同样的,在 Java 中,要使用 StringBuilder,而不能直接用字符串相加。

使用这个方法,内存消耗能击败 100%:

pass-c++

pass-java

pass-python

以下是完整题解代码。

[]
string compressString(string S) { int N = S.length(); string res; int i = 0; while (i < N) { int j = i; while (j < N && S[j] == S[i]) { j++; } res += S[i]; res += to_string(j - i); i = j; } if (res.length() < S.length()) { return res; } else { return S; } }
[]
public String compressString(String S) { int N = S.length(); int i = 0; StringBuilder sb = new StringBuilder(); while (i < N) { int j = i; while (j < N && S.charAt(j) == S.charAt(i)) { j++; } sb.append(S.charAt(i)); sb.append(j - i); i = j; } String res = sb.toString(); if (res.length() < S.length()) { return res; } else { return S; } }
[]
def compressString(self, S: str) -> str: N = len(S) res = '' i = 0 while i < N: j = i while j < N and S[j] == S[i]: j += 1 res += S[i] + str(j - i) i = j if len(res) < len(S): return res else: return S

如果你觉得本文对你有帮助,欢迎关注我的公众号《面向大象编程》,其中的《LeetCode 例题精讲》系列文章正在写作,不仅有题解,更能让你学会解题的通用思路,举一反三!

wechat

统计信息

通过次数 提交次数 AC比率
76847 163143 47.1%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
面试题 01.03-URL化(String to URL LCCI)
下一篇:
面试题 01.09-字符串轮转(String Rotation LCCI)
本文目录
本文目录