zoukankan      html  css  js  c++  java
  • Leetcode 567. 字符串的排列(滑动窗口)

    给定两个字符串 **s1** 和 **s2**,写一个函数来判断 **s2** 是否包含 **s1** 的排列。
    
    换句话说,第一个字符串的排列之一是第二个字符串的子串。
    
    滑动窗口,s2包含s1的排列当且仅当s2存在一个子串,这个子串与s1对应字母个数相同。可以用大小为26的数组记录s1各个字母的个数,s1的话可以边更新到当前位置pos的各个字母的个数,也可以用前缀和。复杂度26 * n。
    
    ```c++
    class Solution {
    public:
        bool checkInclusion(string s1, string s2) {
            int sum1[10005][26], sum2[26];
            memset(sum1, 0, sizeof(sum1)); memset(sum2, 0, sizeof(sum2));
            string tmp = s2;
            s2 = s1; 
            s1 = tmp;
            s1 = " " + s1;
            for(int i = 1; i < s1. size(); I++)
            {
                for(int j = 0; j < 26; j++) sum1[i][j] = sum1[i - 1][j];
                sum1[i][s1[i] - 'a']++;
            }
            for(int i = 0; i < s2. size(); i++) sum2[s2[i] - 'a']++;
            for(int i = 1; i + s2.size() - 1 < s1.size(); I++)
            {
                bool flag =  1;
                for(int j = 0; j < 26; j++)
                {
                    if(sum2[j] != sum1[i + s2.size() - 1][j] - sum1[i - 1][j])
                    {
                        flag = 0;
                        break;
                    }
                }
                if(flag) return true;
            }
            return false;
        }
    };
    
  • 相关阅读:
    伟东云学堂—几何画板学习
    京北鲤鱼----创客教育
    几何画板学习网站
    快乐的搬运工
    少儿编程网
    科技学堂 Arduino轻松学
    跟张老师学硬件arduino板
    科技学堂 Arduino传感器入门
    巧办网
    项目:git+gitlab+jenkins+ansible上线网站
  • 原文地址:https://www.cnblogs.com/lipoicyclic/p/14396644.html
Copyright © 2011-2022 走看看