剑指offer015-字符串中的所有变位词

字符串中的所有变位词

Posted by 高明 on 2020-01-01

剑指offer015-字符串中的所有变位词

题目

给定两个字符串 s 和 p,找到 s 中所有 p 的 变位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

变位词 指字母相同,但排列不同的字符串。

 

示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的变位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的变位词。

 示例 2:

输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的变位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的变位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的变位词。

 

提示:

  • 1 <= s.length, p.length <= 3 * 104
  • s 和 p 仅包含小写字母

 

注意:本题与主站 438 题相同: https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/

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

  • 👍 7
  • 👎 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
    class Solution {
    public List<Integer> findAnagrams(String s, String p) {
    List<Integer> res = new ArrayList<>();
    int m = s.length();
    int n = p.length();

    if(m < n){
    return res;
    }

    int[] sn = new int[26];
    int[] pn = new int[26];

    for(int i = 0; i < n; i++){
    ++sn[s.charAt(i) - 'a'];
    ++pn[p.charAt(i) - 'a'];
    }

    if(Arrays.equals(sn, pn)){
    res.add(0);
    }

    for(int i = n; i<m; i++){
    ++sn[s.charAt(i) - 'a'];
    --sn[s.charAt(i-n) - 'a'];
    if(Arrays.equals(sn, pn)){
    res.add(i-n+1);
    }
    }
    return res;
    }
    }