567.字符串的排列

题目

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

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

示例

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

题解

  1. s2包含s1的排列:s2的子串与s1中字母的类型与数量都相等
  2. 先统计s1中每个字符的数量
  3. 双指针:不断扩大s2的右边界
    1. 在扩大右边界的过程中,若当前窗口的大小等于s1的长度,则去判断该窗口所形成的字符串是否是s1的排列
    2. 若不是s1的排列,跳出并且左指针右移;若是则直接返回

参考代码

class Solution {
    public boolean checkInclusion(String s1, String s2) {

      int[] strs = new int[];
      for(int i = 0; i < s1.length(); i++) {
        strs[s1.charAt(i)-'a']++;
      }

      int left = 0, right = 0;
      boolean flag = true;
      while(right < s2.length()) {
        char cur = s2.charAt(right);
        strs[cur-'a']--;

        if(right - left + 1 == s1.length()) {
          for(int i = 0; i < 26;i++) {
            if(strs[i] != 0) {
              flag = false;
              break;
            }
          }

          if(flag) return true;
          strs[s2.charAt(left++)-'a']++;
        }
        right++;
      }

      return false;
    }
}
上一篇:H5微信授权登录


下一篇:5.LeetCode第14题最长公共前缀