zoukankan      html  css  js  c++  java
  • 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的字符串相等。

  • 相关阅读:
    编译使用tinyxml
    GitLab 项目创建后地址由Localhost改为实际IP的方法
    树莓派相机设定
    MongoDB的数据备份与恢复
    Nginx PHP fpm forbidden 原因
    PSR2规范
    docker 日志管理
    Docker 拷贝文件
    Docker MySQL基本操作
    deepin安装php5.6
  • 原文地址:https://www.cnblogs.com/zhang12345/p/15383360.html
Copyright © 2011-2022 走看看