2.字符串排列

字符串排列

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

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

示例1:

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

示例2:

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

注意:

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

思路:

类似滑窗思想,先统计pattern字符串 s1 的字母表。然后每次从s2 中截取相应长度的字符串统计个数并对比字母表。

public boolean checkInclusion(String s1, String s2) {
    if (s1 == null || s2 == null) {
        return true;
    }
    int[] alpha = new int[26];
    int len = s1.length();
    int len2 = s2.length();
    // 如果第二个字符串长度小,直接返回false
    if (len2 < len) {
        return false;
    }
    // 将 s1 存入字母表
    for (int i = 0; i < len; i++) {
        alpha[s1.charAt(i)-'a'] ++;
    }
    for (int i = 0; i < len2-len+1; i++) {
        if (alpha[s2.charAt(i)-'a'] == 0) {
            continue;
        }
        if (check(s2.substring(i,i+len), alpha.clone())) {
            return true;
        }
    }
    return false;
}
// str与字母表进行比对
public boolean check(String str, int alpha[]) {
    for (int i = 0; i < str.length(); i++) {
        alpha[str.charAt(i)-'a']--;
    }
    for (int i = 0; i < alpha.length; i++) {
        if (alpha[i] != 0) {
            return false;
        }
    }
    return true;
}
发布了11 篇原创文章 · 获赞 0 · 访问量 64

猜你喜欢

转载自blog.csdn.net/weixin_44078008/article/details/105499021