leetcode567——字符串的排列
题目描述
找出字符串s1是不是s2中某一个子序列全排列中的一种;
滑动窗口
1、s1的全排列之后长度不变;
2、然后判断两个字符串中的字符个数是否相等,如果相等既就是全排列相等;
3、定义一个长度为n的固定窗口,并用两个长度26的int[]记录个数,第一个数组记录的是字符串s1中的每个字符的个数,第二个数组记录的是当前窗口内每个字符的个数;
4、左窗口缩小一步,右窗口随之增长一步,并不断变化当前窗口的字符个数;
5、遍历分为两段,第一段遍历长度为l1,最终如果两个数组相等,直接返回true;否则再从l1开始遍历到l2,每次窗口挪动一位,窗口长度不变;
点击查看代码
class Solution {
public boolean checkInclusion(String s1, String s2) {
int l1 = s1.length(), l2= s2.length();
if (l2 < l1)
return false;
//因为都是小写字母,共有26种可能,因此用数组存储比用map存储方便
int[] nums1 = new int[26]; //统计S1各个字符的个数
int[] nums2 = new int[26]; //统计当前窗口各个字符的个数
for (int i = 0; i < l1; i++) {
nums1[s1.charAt(i)-'a']++;
nums2[s2.charAt(i)-'a']++;
}
if (Arrays.equals(nums1,nums2))
return true;
for (int i = l1; i < l2; i++) {
nums2[s2.charAt(i) - 'a']++;
nums2[s2.charAt(i - l1) - 'a']--;
if (Arrays.equals(nums1, nums2))
return true;
}
return false;
}
}

浙公网安备 33010602011771号