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的字符串相等。

  • 相关阅读:
    vCenter添加主机后添加虚拟机失败
    FreeSwitch那些坑之CallCenter
    FreeSwitch录音功能
    在Widnwos中安装VMware vCenter Server
    VMware配置额外内存设置
    VMWare全局禁用vmem虚拟内存文件
    MySQL实现高可用架构之MHA
    Dell Vostro 5590在Windows 10中WIFI经常断开
    tesseract-OCR + pytesseract安装
    python3 TensorFlow训练数据集准备 下载一些百度图片 入门级爬虫示例
  • 原文地址:https://www.cnblogs.com/zhang12345/p/15383360.html
Copyright © 2011-2022 走看看