一开始以为只是简单的找子串,结果,是找子串的排列,我能想到的是暴力解法,也算是变相的滑动窗口,只是我是用HashMap来记录s1的(单)词频,官方解题是用数组。我觉得这题的关键点在通过比较字母数量来判断是否为子串的排列。【由于排列不会改变字符串中每个字符的个数,所以只有当两个字符串每个字符的个数均相等时,一个字符串才是另一个字符串的排列。】话不多说,直接上解题思路和代码!
以下是三种解题方式:
方法1:双循环
采用双循环,外层循环是窗口移动,内层循环是大小为n1(即s1的长度)的窗口。用HashMap来记录词频。
class Solution {
public boolean checkInclusion(String s1, String s2) {
// 1.暴力解法,双循环。借助HashMap,比较字母数量来判断是否为子串排列——时间复杂度和空间复杂度都高
HashMap<Character,Integer> map=new HashMap<>();
int n1=s1.length();
int n2=s2.length();