567. Permutation in String

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

 

Constraints:

  • The input strings only contain lower case letters.
  • The length of both given strings is in range [1, 10,000].

Rust Solution

struct Solution;

impl Solution {
    fn check_inclusion(s1: String, s2: String) -> bool {
        let mut c1: [usize; 26] = [0; 26];
        let mut c2: [usize; 26] = [0; 26];
        let n1 = s1.len();
        let n2 = s2.len();
        let s1: Vec<u8> = s1.bytes().collect();
        let s2: Vec<u8> = s2.bytes().collect();
        if n1 > n2 {
            return false;
        }
        for i in 0..n1 {
            c1[(s1[i] - b'a') as usize] += 1;
            c2[(s2[i] - b'a') as usize] += 1;
        }
        if c1 == c2 {
            return true;
        }
        for i in n1..n2 {
            c2[(s2[i] - b'a') as usize] += 1;
            c2[(s2[i - n1] - b'a') as usize] -= 1;
            if c1 == c2 {
                return true;
            }
        }
        false
    }
}

#[test]
fn test() {
    let s1 = "ab".to_string();
    let s2 = "eidbaooo".to_string();
    let res = true;
    assert_eq!(Solution::check_inclusion(s1, s2), res);
    let s1 = "ab".to_string();
    let s2 = "eidboaoo".to_string();
    let res = false;
    assert_eq!(Solution::check_inclusion(s1, s2), res);
}

Having problems with this solution? Click here to submit an issue on github.