leetcode刷题/字符串 567. 字符串的排列

567. 字符串的排列

题意:

给你两个字符串 s1s2 ,写一个函数来判断 s2 是否包含 s1 的排列。

换句话说,s1 的排列之一是 s2子串

示例 1:

输入:s1 = "ab" s2 = "eidbaooo"
输出:true
解释:s2 包含 s1 的排列之一 ("ba").

示例 2:

输入:s1= "ab" s2 = "eidboaoo"
输出:false
解题思路:
什么叫排序相等?就是相同的字母,顺序不同
怎么判断?s2中寻找s1长度的字符串,然后看字符是否排序相等
怎么找s2s1长度的字符串?每次都在s2中取s1长度,那就是滑动窗口
如何判断两个是排序相等呢?提示说只有字母,那么可以用数组来存,vector容器有重载==,直接判断两个容器是否相等.
  • 到这里就可以顺清楚脉络了,就是创建两个vector容器,然后每次压入滑动窗口的中的字母.判断是否相等即可
代码:
class Solution {
public:
    bool checkInclusion(string s1, string s2) {

    //如果必要字符必字符集还长,直接返回.
	if (s1.length() > s2.length())
		return false;

    //存必要字符
	vector<int> needs(26, 0);      

    //存滑动窗口的字符
	vector<int> windows(26, 0);     

    //压入必要字符
	for (const char c : s1)
		needs[c - 'a'] += 1;

    //压入等长的数据
	for (int i = 0; i < s1.length(); i++)
		windows[s2[i] - 'a']++;

    //如果刚好想到等直接返回
	if (windows == needs)
		return true;

	//滑动窗口
	int left = 0;
	int right = s1.length();
	while (right < s2.length())
	{
        //右边滑进窗口
		windows[s2[right] - 'a']++;

        //左边滑出窗口
		windows[s2[left] - 'a']--;

        //找到了就返回true
		if (windows == needs)
			return true;
		left++;
		right++;
	}

    //说明没找到
	return false;
    }
};
总结:

这道题用滑动窗口思想不难找,需要注意的是vector容器有重载==符号,可以直接判断是否相等.数组本身不大,判断起来速度很快.我在leetcode上运行的时间是0ms.所有不会有超时一说.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

公仔面i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值