zoukankan      html  css  js  c++  java
  • Leetcode 567.字符串的排列

    字符串的排列

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

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

    示例1:

    输入: s1 = "ab" s2 = "eidbaooo"

    输出: True

    解释: s2 包含 s1 的排列之一 ("ba").

       

    示例2:

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

    输出: False

       

    注意:

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

    思路

      1.这道题,我们用到的算法是滑动窗口,思路大体是这样的:

      首先字符串s1的排列的可能性应该是它的长度的阶乘,因为字符串长度可能为10000,所以找出所有排列情况是不太可能。我们可以转换思路,不要关注排列的形式,而是关注排列中元素的数量关系,比如aab,那么,转换为数量关系就是{a:2,b:1},因为S1长度为3,所以我们的窗口长度也为3,如果我们在S2的找到了这样一个窗口符合出现a的次数是两个,b是一个,那么S2就是包含S1的排列的。

      2.什么是滑动窗口啊?

      窗口表示的数组内我们重点关注的一块范围,比如此处的范围是e~i

      

      滑动的意思及时,这个窗口会动,但是窗口的大小不变,比如此时右滑一位时,e就会离开,d就会加入。

      

      3.再来理解一遍题?

      我们说了,不要关注排列的形式,而是关注排列中元素的数量关系,比如aab,那么,转换为数量关系就是{a:2,b:1},因为S1长度为3,所以我们的窗口长度也为3,如果我们在S2的找到了这样一个窗口符合出现a的次数是两个,b是一个,那么S2就是包含S1的排列的。换到这个题中,同理:

      

      所以,输出为True。 

     1 import java.util.Arrays;
     2 
     3 class Solution {
     4     public boolean checkInclusion(String s1, String s2) {
     5         int l1 = s1.length();
     6         int l2 = s2.length();
     7         int[] c1 = new int[26];
     8         int[] c2 = new int[26];
     9         for(char c : s1.toCharArray())
    10             c1[c-'a']++;
    11 
    12         for(int i=0;i<l2;i++)
    13         {
    14             if(i>=l1)
    15                 --c2[s2.charAt(i-l1)-'a'];//先把坐标查过的
    16             c2[s2.charAt(i)-'a']++;
    17             if(Arrays.equals(c1, c2))
    18                 return true;
    19         }
    20         return false;
    21     }
    22 }
  • 相关阅读:
    PTA 乙级 1032 挖掘机技术哪家强 (20分) C++
    Jmeter接口测试之MD5函数使用
    charles基础理论一
    Jmeter接口测试之函数和cookies
    appium+robotframework之权限设置
    appium+robotframework之context问题解决
    jmeter接口测试之断言持续时间
    Appium+robotframework 自动化之软键盘的调起(文本框无法输入值)
    Jmeter接口测试之测试计划和线程组的关系
    Jmeter接口测试之用户定义变量
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10381389.html
Copyright © 2011-2022 走看看