Leetcode探索——字节跳动·挑战字符串:字符串的排列
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
换句话说,第一个字符串的排列之一是第二个字符串的子串。
示例1:
输入: s1 = "ab" s2 = "eidbaooo"
输出: True
解释: s2 包含 s1 的排列之一 ("ba").
示例2:
输入: s1= "ab" s2 = "eidboaoo" 输出: False
注意:
- 输入的字符串只包含小写字母
- 两个字符串的长度都在 [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 }

浙公网安备 33010602011771号