Leetcode探索——字节跳动·挑战字符串:字符串的排列

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

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

示例1:

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

示例2:

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

注意:

  1. 输入的字符串只包含小写字母
  2. 两个字符串的长度都在 [1, 10,000] 之间

算法思路:

int arr1[]表示字符串s1每个字符各个字母的数量;int arr2[]表示字符串s2中,滑动窗口长度为str1.length的字符字串各个字母的数量;

核心判断:arr1[],和arr2[]两个数组完全相同(即滑动窗口字串即为s1的一个排列)。

滑动窗口滑动:

①当i>=len1时,则减除i-len1下标的计数arr2[str2[i-len1]-'a']--;

②无论如何,都记录i下标的计数arr2[str2[i]-'a']++;

代码:

 1 import java.util.Arrays;
 2 
 3 class Solution {
 4     public boolean checkInclusion(String s1, String s2) {
 5         
 6         if(s1 == null || s1.length() == 0 || s2 == null || s2.length() == 0) {
 7             return false;
 8         }
 9         
10         char str1[] = s1.toCharArray();
11         char str2[] = s2.toCharArray();
12         int len1 = str1.length;
13         int len2 = str2.length;
14         int arr1[] = new int[26];
15         int arr2[] = new int[26];
16         
17         for(int i = 0 ;i < len1; i++) {
18             arr1[str1[i]-'a']++;
19         }
20         
21         for(int i = 0 ;i < len2; i++) {
22             if(i >= len1) {
23                 arr2[str2[i-len1]-'a']--;
24             }
25             arr2[str2[i]-'a']++;
26             if(Arrays.equals(arr1, arr2)) {
27                 return true;
28             }
29         }
30         return false;
31     }
32 }

 

posted @ 2018-12-25 16:00  trashbird_fly  阅读(39)  评论(0)    收藏  举报