前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2022-05-12:小歪每次会给你两个字符串:笔记s1和关键词s2,请你写一个函数,判断s2的排列之一是否是s1的子串。

2022-05-12:小歪每次会给你两个字符串:笔记s1和关键词s2,请你写一个函数,判断s2的排列之一是否是s1的子串。

作者头像
福大大架构师每日一题
发布2022-06-04 10:52:50
1700
发布2022-06-04 10:52:50
举报

2022-05-12:小歪每次会给你两个字符串:

笔记s1和关键词s2,请你写一个函数,

判断s2的排列之一是否是s1的子串。

如果是,返回true;

否则,返回false。

来自字节飞书团队。

答案2022-05-12:

欠债表。滑动窗口,str2存map。

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

代码语言:javascript
复制
fn main() {
    let ans=check2("fabkbbca","abcb");
    println!("ans = {}",ans);
}

fn check2( s1:&str,  s2:&str) ->bool{
    if s1.chars().count() < s2.chars().count() {
        return false;
    }

    let str2: Vec<char> = s2.chars().collect::<Vec<_>>();
     let mut count:[isize;256]=[0;256];
    for i in 0..s2.chars().count() {
        count[str2[i] as usize]+=1;
    }
    let m = s2.chars().count() as isize;
    let  st1: Vec<char> = s1.chars().collect::<Vec<_>>();
    let mut in_valid_times:isize = 0;
    let mut r:isize = 0;
    while r < m {
        if count[st1[r as usize] as usize] <= 0 {
            in_valid_times+=1;
        }
        count[st1[r as usize] as usize]-=1;
        r+=1;
    }
    while r < st1.len() as isize {
        if in_valid_times == 0 {
            return true;
        }
        if count[st1[r as usize] as usize] <= 0 {
            in_valid_times+=1;
        }
        count[st1[r as usize] as usize]-=1;
        if count[st1[(r - m) as usize] as usize] < 0 {
            in_valid_times-=1;
        }
        count[st1[(r - m) as usize] as usize]+=1;
        r+=1;
    }
    return in_valid_times == 0;
}

执行结果如下:

***

[左神java代码](https://github.com/algorithmzuo/weekly-problems/blob/main/src/class_2022_03_2_week/Code02_StringCheck.java)

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

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

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

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

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