zoukankan      html  css  js  c++  java
  • 算法题:字符串的排列

    描述

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

    换句话说,第一个字符串的排列之一是第二个字符串的子串。

    示例1:

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

    示例2:

    输入: s1= "ab" s2 = "eidboaoo"
    输出: False

    注意:

    输入的字符串只包含小写字母
    两个字符串的长度都在 [1, 10,000] 之间

    链接:https://leetcode-cn.com/problems/permutation-in-string

    思路

    一个字符串s的排列指s的每个字符出现都相等,可以用哈希表来存储s每个字符的次数,又由于只包含小写字母,可考虑用一个长度26的数组替代哈希表。
    然后可以用一个s长度的区间依次遍历,检查该区间是否每个字符频次都与s相等。

    代码:

    class Solution {
    public:
        bool checkInclusion(string s1, string s2) {
            if (s1.size() > s2.size()) return false;
            int count[26], tmp_count[26];
            memset(count, 0, sizeof count);
            memset(tmp_count, 0, sizeof tmp_count);
            for (const char& c : s1) {
                count[c-'a']++;
            }
    
            for (int i = 0, j = 0;j < s2.size();) {
                tmp_count[s2[j]-'a']++;
                if (j - i + 1 == s1.size()) {
                    bool yes = true;
                    for (int k = 0;k < 26;k++) {
                        if (tmp_count[k] != count[k]) {
                            yes = false;
                            break;
                        }
                    }
                    if (yes) return true;
                    tmp_count[s2[i]-'a']--;
                    ++i;
                }
                ++j;
            }
            return false;
        }
    };
    

    复杂度
    时间复杂度:O(26N)
    空间复杂度:O(1)

  • 相关阅读:
    写给理工科人看的乐理(一)声学基础
    魔方最少记忆还原法
    甲乙两人互猜数字(鬼谷子问题)的逻辑推理与算法建模
    模板元编程实现素数判定
    UVa OJ 194
    UVa OJ 175
    UVa OJ 197
    UVa OJ 180
    UVa OJ 140
    判断input或者div.span等标签是否存在
  • 原文地址:https://www.cnblogs.com/dinjufen/p/14161484.html
Copyright © 2011-2022 走看看