字符串的排列


给你两个字符串 s1s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false

换句话说,s1 的排列之一是 s2子串

示例 1:

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

示例 2:

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

提示:

  • 1 <= s1.length, s2.length <= 10^4
  • s1s2 仅包含小写字母
class Solution {
    public boolean checkInclusion(String s1, String s2) {

        //擦,谁能
        //检查是否满足.
        int s1Len = s1.length();
        int s2Len = s2.length();

        if(s1Len > s2Len){
            return false;
        }
        
        //s1 的字符数组
        int[] count1 = new int[26];
        //s2 的字符数组
        int[] count2 = new int[26];

        for(int i = 0; i < s1Len; i++){
            count1[s1.charAt(i) - 'a']++;
            count2[s2.charAt(i) - 'a']++;
        }
        //如果两个数组相同,则代表相同
        if (Arrays.equals(count1, count2)) {
            return true;
        }

        for(int i = s1Len; i < s2Len; i++){
            count2[s2.charAt(i) - 'a']++;

            //减去移动之后的数字
            count2[s2.charAt(i - s1Len) - 'a']--;
            //如果两个数组相同,则代表相同
            if (Arrays.equals(count1, count2)) {
                return true;
            }
        }

        return false;

    }

    // private boolean checkSubStr(char[] array1,char[] array2){
        
    //     //当前相同的个数
    //     int same = 0;
    //     //需要相同的个数
    //     int needSameNum = array1.length;
    //     //s2的索引
    //     int s2Idx = 0;
    //     //s1的索引
    //     int s1Idx = 0;

    //     for(; s2Idx< array2.length; s2Idx++){
    //         if(same == needSameNum){
    //             return true;
    //         }
    //         if(array1[s1Idx] == array2[s2Idx]){
    //             same++;
    //             s1Idx++;
    //         } else {
    //             s1Idx=0;
    //             same=0;
    //         }
    //     }
    //     if(same == needSameNum){
    //         return true;
    //     }
    //     return false;
    // }
}

文章作者: 冯廷鑫
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 冯廷鑫 !
  目录