前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2021-06-30:给定长度为m的字符串aim,以及一个长度为n的字符串str ,问能否在str中找到一个长度为m的连续子串,

2021-06-30:给定长度为m的字符串aim,以及一个长度为n的字符串str ,问能否在str中找到一个长度为m的连续子串,

作者头像
福大大架构师每日一题
发布2021-08-05 16:14:23
8040
发布2021-08-05 16:14:23
举报

2021-06-30:给定长度为m的字符串aim,以及一个长度为n的字符串str ,问能否在str中找到一个长度为m的连续子串, 使得这个子串刚好由aim的m个字符组成,顺序无所谓, 返回任意满足条件的一个子串的起始位置,未找到返回-1。

福大大 答案2021-06-30:

map+all+滑动窗口。

map:欠账表。

all:总欠账数。

代码用golang编写。代码如下:

代码语言:javascript
复制
package main

import "fmt"

func main() {
    s1 := "moonfdd"
    s2 := "ddf"
    ret := containExactly3(s1, s2)
    fmt.Println(ret)
}

func containExactly3(s1 string, s2 string) int {
    if len(s1) < len(s2) {
        return -1
    }
    M := len(s2)
    count := make([]int, 256)
    for i := 0; i < M; i++ {
        count[s2[i]]++
    }
    all := M
    R := 0
    // 0~M-1
    for ; R < M; R++ { // 最早的M个字符,让其窗口初步形成
        if count[s1[R]] > 0 {
            count[s1[R]]--
            all--
        } else {
            count[s1[R]]--
        }
    }
    // 窗口初步形成了,并没有判断有效无效,决定下一个位置一上来判断
    // 接下来的过程,窗口右进一个,左吐一个
    for ; R < len(s1); R++ {
        if all == 0 { // R-1
            return R - M
        }
        if count[s1[R]] > 0 {
            all--
            count[s1[R]]--
        } else {
            count[s1[R]]--
        }
        if count[s1[R-M]] >= 0 {
            count[s1[R-M]]++
            all++
        } else {
            count[s1[R-M]]++
        }
    }
    if all == 0 {
        return R - M
    } else {
        return -1
    }
}

执行结果如下:

***

[左神java代码](https://github.com/algorithmzuo/coding-for-great-offer/blob/main/src/class12/Code01_ContainAllCharExactly.java)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档