LeetCode 567. Permutation in String(字符串的排列) 滑动窗口/Medium


1.Description

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

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


2.Example

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

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

3.Solution

使用了滑动窗口和Arrays.equals函数:
窗口的长度为s1的长度,定义两个数组,nums1统计s1中各个字符出现次数,然后nums2在窗口滑动过程中统计窗口中各字符出现的次数,如果两个数组相等的话说明s2含有s1的排列。

class Solution {
    public boolean checkInclusion(String s1, String s2) {
        if(s1.length()>s2.length()){
            return false;
        }
    	int[] nums1 = new int[26];
    	int[] nums2 = new int[26];
    	
    	for(int i=0;i<s1.length();i++) {
    		nums1[s1.charAt(i)-'a']++;
    		nums2[s2.charAt(i)-'a']++;
    	}
    	if(Arrays.equals(nums1, nums2)) {
    		return true;
    	}
    	
    	for(int i = s1.length();i<s2.length();i++) {
    		nums2[s2.charAt(i)-'a']++;
    		nums2[s2.charAt(i-s1.length())-'a']--;
    		if(Arrays.equals(nums1, nums2)) {
    			return true;
    		}
    	}
    	return false;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值