leetcode-滑动窗口 字符串的排列

给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。

换句话说,s1 的排列之一是 s2 的 子串 。

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

解题思路一:创建两个vector容器cnt1 cnt2,分别存储两个字符串中字母 的个数,cnt1存储s1字符串中字母个数是不变的,cnt2在添加进一个s2字符串时,同时需要将容器最左边的字母移除,比较两个容器是否相等,直到相等为止,否则返回false。

解题思路二:只创建一个容器,先对s1中字符串进行遍历,对cnt中对应字母处减一,遍历s2字符串的前n个字母,cnt对应字母处做加一操作,对cnt进行遍历,当某一处的值不为0时将diff+1,若diff是0则返回true。否则需要接着遍历s2字符串,若移进的字符为x,移出的字符为y,移进x之前,看cnt[x]是否为0,若为0,diff+1;然后cnt[x]+1,再看cnt[x]是否为0,如果为0,diff-1.移出的字符y进行相同的操作,当diff为0的时候,返回true。

解题思路三:运用双指针,建立一个容器cnt,首先遍历s1字符串,容器对应字母处做减一操作,之后从最左边开始遍历s2,移进字符为x遍历到相应字符时做加一操作,当cnt[x]>0时,我们需要用左指针进行移出操作,移出的字符为y,cnt[y]-1,直到cnt[x]的值=0时停止,因为最开始遍历s1时一直都是做的减一的操作,而我们移进s2时都是做的加一的操作,当right和left指针之间的距离相差n,就说明我们对cnt进行了加n的操作,此时cnt各个元素之和就为0.说明right和left之间的字符串与s1的字符串相等。

posted on 2021-10-08 23:10  啥123  阅读(37)  评论(0编辑  收藏  举报