字符串压缩
题目描述
利用字符串重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)
找到字符串中连续的字符的问题
测试用例
先考虑有哪些特殊的输入情况
- 空字符串
' '
预期结果为' ' (具体输出的结果应该是' ’还是null在面试的时候注意和面试官交流核实)
- 没有可以压缩的字符串
abcdcba
- 普通的字符串
'aabbcccddd'
暴力法
从左至右依次比较相邻的两个字母
class Solution(object):
def compressString(self, S):
"""
:type S: str
:rtype: str
"""
length=len(S)
ch=''
cnt=0
ans=''
if length==0:
return ''
else:
for i in range(0,length):
if i==length-1 and ch==S[i]:
ans=ans+ch+str(cnt+1)
elif i==length-1:
ans=ans+ch+str(cnt)+S[i]+str(1)
elif i==0:
ch=S[0]
cnt=1
elif ch==S[i]:
cnt+=1
else:
ans=ans+ch+str(cnt)
ch=S[i]
cnt=1
length2=len(ans)
if length<=length2:
return S
else:
return ans
上述代码讨论的情况太多,下面通过改进,改成具有python风格的代码
python 风格的暴力法
class Solution(object):
def compressString(self, S):
"""
:type S: str
:rtype: str
"""
if not S:
return ''
else:
ch = S[0]
ans = ''
cnt = 0
for type in S:
if ch==type:
cnt+=1
else:
ans+=ch+str(cnt)
ch=type
cnt=1
ans+=ch+str(cnt)
return ans if len(ans)<len(S) else S
双指针法
暴力法的时间由于每一步都需要对计数器进行加一操作,双指针的方法可以减少这部分计算。双指针法是找字符串中连续字符的经典方法。
class Solution(object):
def compressString(self, S):
"""
:type S: str
:rtype: str
"""
length=len(S)
ans=''
i=0
while i<length:
j=i+1
while j<length and S[i]==S[j]:
j+=1
ans+=S[i]+str(j-i)
i=j
if len(ans)<len(S):
return ans
else:
return S
最后贴上完整的代码(可以直接复制运行):
class Solution(object):
def compressString(self, S):
"""
:type S: str
:rtype: str
"""
length=len(S)
ans=''
i=0
while i<length:
j=i+1
while j<length and S[i]==S[j]:
j+=1
ans+=S[i]+str(j-i)
i=j
if len(ans)<len(S):
return ans
else:
return S
def main():
str1='aabbcccddd'
str2='abcdef'
str3=''
s=Solution()
ans1=s.compressString(str1)
ans2=s.compressString(str2)
ans3=s.compressString(str3)
print(ans1)
print(ans2)
print(ans3)
if __name__=='__main__':
main()