Description
Given two strings s1 and s2, write a function to return true if s2 contains the permutation of s1. In other words, one of the first string’s permutations is the substring of the second string.
Example 1:
Input:s1 = “ab” s2 = “eidbaooo”
Output:True
Explanation: s2 contains one permutation of s1 (“ba”).
Example 2:
Input:s1= “ab” s2 = “eidboaoo”
Output: False
Note:
The input strings only contain lower case letters.
The length of both given strings is in range [1, 10,000].
Problem URL
Solution
给两个String,判断s1的组合是否存在于s2当中。
- How do we know string
p
is a permutation of strings
? Easy, each character inp
is ins
too. So we can abstract all permutation strings of s to a map (Character -> Count). i.e.abba -> {a:2, b:2}
. Since there are only 26 lower case letters in this problem, we can just use an array to represent the map. - How do we know string
s2
contains a permutation ofs1
? We just need to create a sliding window with length ofs1
, move from beginning to the end ofs2
. When a character moves in from right of the window, we subtract 1 to that character count from the map. When a character moves out from left of the window, we add 1 to that character count. So once we seeall zeros
in the map, meaning equal numbers of every characters betweens1
and the substring in the sliding window, we know the answer is true.
Code
class Solution {
public boolean checkInclusion(String s1, String s2) {
int len1 = s1.length(), len2 = s2.length();
if (len1 > len2){
return false;
}
int[] map = new int[26];
for (int i = 0; i < len1; i++){
map[s1.charAt(i) - 'a']++;
map[s2.charAt(i) - 'a']--;
}
if (allZero(map)){
return true;
}
for (int i = len1; i < len2; i++){
map[s2.charAt(i) - 'a']--;
map[s2.charAt(i - len1) - 'a']++;
if (allZero(map)){
return true;
}
}
return false;
}
private boolean allZero(int[] map){
for (int i = 0; i < 26; i++){
if (map[i] != 0){
return false;
}
}
return true;
}
}
Time Complexity: O(n)
Space Complexity: O(1)