leetcode-567 字符串排列

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] 之间

### 解法一: sliding window(滑动窗口)法来做

每次s2中截取和s1等长的字符串,与s1进行比较,利用数组来统计a-z的数量,辅助比较

java实现如下:

class Solution {
    public boolean checkInclusion(String s1, String s2) {
        //s1 小字符串   s2 大字符串  s1 >= s2
        if(s1.length() > s2.length())   return false;
        
        int[] count = new int[26];
        for(int i = 0; i < s1.length();i++){
            //charat (i)返回字符串s1的第i个字符。假设此字符串只包含小写字母(即将字符“a”映射到索引0,
            //将字符“b”映射到索引1,以此类推(将“z”映射到索引25)。
            count[s1.charAt(i) - 'a'] ++; 
            count[s2.charAt(i) - 'a'] --;
        }
        
        if(helper(count)){
            return true;
        }
        
        for(int i = s1.length(); i < s2.length(); i++){
            count[s2.charAt(i) - 'a'] --;
            count[s2.charAt(i - s1.length()) - 'a'] ++;
            if(helper(count)){
                return true;
            }
        }
        return false;
    }
    
    
    //数组为空返回true
    public boolean helper(int[] count){
        for(int num: count){
            if(num != 0){
                return false;
            }
        }
        return true;
    }
}

c++实现如下:

class Solution {
public:
    bool checkInclusion(string s1, string s2) {
        int n1 = s1.size(), n2 = s2.size(),left = 0;
        vector<int> m(128);
        for(char c: s1) ++m[c];
        for(int right = 0; right < n2; ++right){
            if(--m[s2[right]] < 0){
                while(++m[s2[left++]] != 0){}
            }else if(right - left + 1 == n1)    return true;
        }
        return n1 == 0;
    }
};
原文地址:https://www.cnblogs.com/fightingcode/p/10804468.html