《编程珠玑》字符串包含

不忘初心,砥砺前行 

作者 | 陌无崖

转载请联系授权 

字符串包含

题目要求解题思路蛮力轮询排序后轮询

题目要求

给定一个长字符串a和短字符串b,高效判断短字符串b中的所有字符是否都在长字符串中
如:

a := "ABCD"
b := "BAD"//输出true

a := "ABCD"
b := "BAE"//false

a := "ABCD"
b := "AA" //true

解题思路

对于此类题目,通常解决起来并不难,利用Golang中的contains()函数的辅助可以快速编写成功,为了更好的理解,我们不使用contain()函数。

蛮力轮询

轮询短字符串b中的每一个字符,逐个进行和长字符串进行比较,代码如下:

func StringContain(a string, b string) bool {
    ar := []rune(a)
    br := []rune(b)
    // 用短字符串去寻找长字符串进行比较,因此主循环用短字符串进行控制
    for i := 0; i < len(br); i++ {
        // 定义一个 j 用来每次循环都要保证从 0 开始,j 代表 ar的下表
        j := 0
        // 循环长字符串
        for j = 0; j < len(ar) && br[i] != ar[j]; j++ {

        }
        // 如果在遍历的过程中遇到不符合情况的字符,则上一个循环会比较到 ar 最后,可用 j 作为判断
        // 如果在循环的过程中找到相同字符,第二个循环会提前结束
        if j > len(ar) {
            return false
        }
    }
    return true
}
排序后轮询

对字符串进行排序,然后再对字符串进行依次轮询,我们使用快速排序的方法,为了简单,我们直接使用Go语言的sort包的Sort方法,需要实现相应的接口,首先我们需要自定义一个类型

type RuneSclice []rune

然后用该类型实现相关接口

func (p RuneSclice) Len() int {
    return len(p)
}
func (p RuneSclice) Less(i, j int) bool {
    return p[i] < p[j]
}
func (p RuneSclice) Swap(i, j int) {
    p[i], p[j] = p[j], p[i]
}

编写判断字符串是否包含的函数

func StringSortContain(a string, b string) bool {
    ar := []rune(a)
    var ars RuneSclice
    ars = ar
    br := []rune(b)
    var brs RuneSclice
    brs = br
    // 排序
    sort.Sort(ars)
    sort.Sort(brs)
    // 定义两个指针分别指向ars和brs
    pa := 0
    pb := 0
    for pb < brs.Len() {
        // 移动pa指针寻找相同的字符,pb暂时不移动
        for (pa < ars.Len()) && (ars[pa] < brs[pb]) {
            pa += 1
        }
        // 说明pa遍历结束仍然未找到,存在不相同的字符,返回false
        if pa >= ars.Len() || ars[pa] > brs[pb] {
            return false
        }
        // 说明找到了相同的,开始寻找下一个,pb向后移动
        pb += 1
    }
    return true
}

关注我试试回复以下关键词

go 微服务 ppt

大数据 书籍 资料 


END

今日推荐阅读

RabbitMQ系列笔记广播模式和路由模式 
RabbitMQ系列笔记入门篇

RabbitMQ系列笔记work模式

RabbitMQ系列笔记work模式

protoc语法详解及结合grpc定义服务

Golang中Model的使用

基于Nginx和Consul构建高可用及自动发现的Docker服务架构

▼关注我,一起成长

    主要分享 学习心得、笔记、随笔▼

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值