剑指offer014-字符串中的变位词

符串中的变位词

Posted by 高明 on 2020-01-01

剑指offer014-字符串中的变位词

题目

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

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

 

示例 1:

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

示例 2:

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

 

提示:

  • 1 <= s1.length, s2.length <= 104
  • s1s2 仅包含小写字母

 

注意:本题与主站 567 题相同: https://leetcode-cn.com/problems/permutation-in-string/

Related Topics
  • 哈希表
  • 双指针
  • 字符串
  • 滑动窗口

  • 👍 19
  • 👎 0
  • 思路

    滑动窗口,记录窗口内的字串

    代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    class Solution {
    public boolean checkInclusion(String s1, String s2) {
    int left = 0;
    int right = 0;
    Map<Character, Integer> s1Map = new HashMap<>();
    for (int i = 0; i < s1.length(); i++) {
    char c = s1.charAt(i);
    s1Map.put(c, s1Map.getOrDefault(c, 0) + 1);
    }

    Map<Character, Integer> s2Map = new HashMap<>();
    s2Map.put(s2.charAt(0), 1);
    while (right - left + 1 <= s2.length() && right < s2.length()) {
    if (!s1Map.containsKey(s2.charAt(right))) {
    left = right = right + 1;
    if (right >= s2.length()) {
    return false;
    }
    s2Map.clear();
    s2Map.put(s2.charAt(right), s2Map.getOrDefault(s2.charAt(right), 0) + 1);
    } else if (right - left + 1 < s1.length()) {
    right += 1;
    if (right >= s2.length()) {
    return false;
    }
    s2Map.put(s2.charAt(right), s2Map.getOrDefault(s2.charAt(right), 0) + 1);
    } else if (right - left + 1 == s1.length()) {
    if (!judge(s1Map, s2Map)) {
    right += 1;
    left += 1;
    if (right >= s2.length()) {
    return false;
    }
    s2Map.put(s2.charAt(right), s2Map.getOrDefault(s2.charAt(right), 0) + 1);
    s2Map.put(s2.charAt(left - 1), s2Map.getOrDefault(s2.charAt(left - 1), 0) - 1);
    } else {
    return true;
    }
    }
    }
    return false;
    }

    private boolean judge(Map<Character, Integer> s1Map, Map<Character, Integer> s2Map) {
    if (s2Map.keySet().size() != s1Map.keySet().size()) {
    return false;
    }

    for (Character key :
    s2Map.keySet()) {
    if (!s1Map.containsKey(key)) {
    return false;
    } else {
    if (!s1Map.get(key).equals(s2Map.get(key))) {
    return false;
    }
    }
    }
    return true;
    }
    }
    1
    2
    3
    解答成功:
    执行耗时:25 ms,击败了16.09% 的Java用户
    内存消耗:39 MB,击败了5.41% 的Java用户