567. 字符串的排列

1. 背

子串保证的大小肯定一致,只是内容会不同,那么可以用哈希存储s1,用步长为s1.length()的窗口滑动s2,如果两个哈希相等,就是满足条件。

这个哈希不能用unordered_map因为为0就删除,不等于0–,等于0就创建,不等于0就++,这个操作对于C++的unordered_map太困难了,反正也说了都是小写字母,就用长度为26的数组表示。

2. 题目

给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。

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

示例 1:

输入:s1 = “ab” s2 = “eidbaooo”
输出:true
解释:s2 包含 s1 的排列之一 (“ba”).
示例 2:

输入:s1= “ab” s2 = “eidboaoo”
输出:false

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/permutation-in-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

3. 答案

class Solution {
public:
    bool checkInclusion(string s1, string s2) {
        if(s1.length()>s2.length())
        return false;
        vector<int>charmap(26,0);
        for(auto val : s1)
            ++charmap[val-'a'];

        vector<int>charmap_new(26,0);
        int left = 0,right = s1.length()-1;
        for(int i=left;i<=right;++i)
            charmap_new[s2[i]-'a']++;
        
        if(charmap==charmap_new)
            return true;
        while(right+1<s2.length())
        {
            charmap_new[s2[left++]-'a']--;
            charmap_new[s2[++right]-'a']++;
            if(charmap_new==charmap)
                return true;
        }
        return false;
    }
};
字符串以\0(即空字符)来标志字符串的结束。在C语言中,字符串是由一系列连续的字符组成的,最后一个字符必须是\0来表示字符串的结束。这个字符的ASCII码值为0,表示空字符。 在使用字符串时,我们可以使用字符数组来存储和操作字符串。在数组中,字符串的实际内容被存储在字符数组的相邻位置,以连续的方式排列。最后一个字符是\0,用来表示字符串的结束。 当我们使用字符串的各种函数时,它们会根据\0来确定字符串的结束位置。这样,我们可以通过在数组中找到\0来确定字符串的长度。 例如,如果我们有一个字符数组char str[10],其中存储了一个字符串"Hello",那么实际上在字符数组中存储的内容是{'H', 'e', 'l', 'l', 'o', '\0', 0, 0, 0, 0}。当我们使用字符串函数时,比如strlen(str),它会从数组开始位置开始遍历,直到找到\0为止,从而确定字符串的长度为5。 另外,在字符串的输入和输出时,我们也需要注意\0的存在。当我们使用scanf函数输入一个字符串时,它会将输入的字符存储到字符数组中,并在最后加上\0来标志字符串的结束。同样地,当我们使用printf函数输出一个字符串时,它会从字符数组的开始位置开始输出,直到遇到\0为止。 总之,使用\0来标志字符串的结束,是C语言字符串的一种约定和常用方式。它使得我们可以方便地操作和处理字符串,包括确定字符串的长度和进行输入输出操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

tux~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值