638afdcf021abf844a3c6c62e12d75bb.png

前言

本系列文章为《程序员面试金典》刷题笔记。

题目位置:字符串压缩 题集:程序员面试金典

题目

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

示例1:

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

示例2:

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

提示:

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

思路

int
count := 1
res :=string(S[0])

从第一个字符开始遍历

for i:=1;i<len(S);i++{
    ......

每次当前字符和前一个字符比较,只要和上一个不同就保存记录下来,然后计数器重置为1。

if S[i] == S[i-1]{
    count ++
}else{
    res = res + strconv.Itoa(count) + string(S[i])
    count = 1
 }
0-2
 if len(S)<= 2{
        return S
    }

完整代码见下一节代码(优化前)

看结果:

040eb53c7ca76920808196644dd8b209.png
go
golang
bytes.Bufferbuffer.Grow()capacity

用法举例:

 var buffer bytes.Buffer
        buffer.WriteString(hello)
        buffer.WriteString(",")
        buffer.WriteString(world)
        _ = buffer.String()

代码见下一节,优化后。

ea2291b299490df05e4bd253e7d696da.png

棒极了,写完提交github睡觉。

代码

优化 Go

func compressString(S string) string {
    if len(S)<= 2{
        return S
    }
    count := 1
    res :=string(S[0])
    for i:=1;i<len(S);i++{
        if S[i] == S[i-1]{
            count ++
        }else{
            res = res + strconv.Itoa(count) + string(S[i])
            count = 1
        }
    }

    res = res + strconv.Itoa(count)

    if len(res) < len(S){
        return res
    }else{
        return S
    }
}

优化后 Go

func compressString(S string) string {
    if len(S)<= 2{
        return S
    }
    count := 1
    var res bytes.Buffer
    res.WriteString(string(S[0]))
    for i:=1;i<len(S);i++{
        if S[i] == S[i-1]{
            count ++
        }else{
            res.WriteString(strconv.Itoa(count))
            res.WriteString(string(S[i]))
            count = 1
        }
    }

    res.WriteString( strconv.Itoa(count) )
    resStr := res.String()
    if len(resStr) < len(S){
        return resStr
    }else{
        return S
    }
}

本文由博客一文多发平台 OpenWrite 发布!