题目如下

给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的某个变位词。

换句话说,第一个字符串的排列之一是第二个字符串的 子串 。

示例 1:
输入: s1 = “ab” s2 = “eidbaooo”
输出: True
解释: s2 包含 s1 的排列之一 (“ba”).

示例 2:
输入: s1= “ab” s2 = “eidboaoo”
输出: False

解题方法1

滑动窗口

class Solution
{public:bool checkInclusion(string s1, string s2) {int n = s1.length(), m = s2.length();if (n > m){return false;}vector<int> cnt1(26), cnt2(26);for (int i = 0; i < n; ++i) {++cnt1[s1[i] - 'a'];++cnt2[s2[i] - 'a'];}if (cnt1 == cnt2){return true;}for (int i = n; i < m; ++i) {++cnt2[s2[i] - 'a'];--cnt2[s2[i - n] - 'a'];if (cnt1 == cnt2){return true;}}return false;}
};

优化

class Solution
{public:bool checkInclusion(string s1, string s2){int n = s1.length(), m = s2.length();if (n > m){return false;}vector<int> cnt(26);for (int i = 0; i < n; ++i) {--cnt[s1[i] - 'a'];++cnt[s2[i] - 'a'];}int diff = 0;for (int c : cnt) {if (c != 0) {++diff;}}if (diff == 0) {return true;}for (int i = n; i < m; ++i) {int x = s2[i] - 'a', y = s2[i - n] - 'a';if (x == y) {continue;}if (cnt[x] == 0) {++diff;}++cnt[x];if (cnt[x] == 0) {--diff;}if (cnt[y] == 0) {++diff;}--cnt[y];if (cnt[y] == 0) {--diff;}if (diff == 0){return true;}}return false;}
};

解题方法2

双指针

class Solution
{public:bool checkInclusion(string s1, string s2) {int n = s1.length(), m = s2.length();if (n > m) {return false;}vector<int> cnt(26);for (int i = 0; i < n; ++i){--cnt[s1[i] - 'a'];}int left = 0;for (int right = 0; right < m; ++right) {int x = s2[right] - 'a';++cnt[x];while (cnt[x] > 0) {--cnt[s2[left] - 'a'];++left;}if (right - left + 1 == n){return true;}}return false;}
};

1033-字符串中的变位词相关推荐

  1. 剑指 Offer II 014. 字符串中的变位词

    剑指 Offer II 014. 字符串中的变位词 题目 示例 解答 题目来源为leetcode 题目 给定两个字符串s1和s2,写一个函数来判断s2是否包含s1的某个变位词. 换句话说,第一个字符串 ...

  2. 2021-11-14剑指OfferII014.字符串中的变位词

    class Solution:def checkInclusion(self, s1: str, s2: str) -> bool:n1 = len(s1)n2 = len(s2)if n1 & ...

  3. leetcode 字符串中的变位词

    题目链接 思路:滑动窗口 分析:从s2中查找s1的位置,不过这里s1在s2中的字符顺序可以是乱的,但是长度肯定是一样的,那么这个长度就是滑动窗口的长度.我们用两个窗口,长度都是s1的长度,然后每次比对 ...

  4. 浙大python判断两个字符串是否为变位词_python数据结构与算法 变位词

    变位词 问题简述 "变位词"判断问题:所谓 "变位词" 是指两个词之间存在组成字母的重新排列关系,例如 Heart 和 Earth,python 和 typho ...

  5. 浙大python判断两个字符串是否为变位词_算法2----------变位词

    1.背景: 变位词指的是一个单词可以通过改变其他单词中字母的顺序来得到,也叫做兄弟单词,如army->mary. 题1:判断两个字符串s1和s2是否为变位词. 经典的字符串变位词检测问题是比较不 ...

  6. java变位词_Java程序检查字符串是否是变位词

    字符串变位词检查:有多种方法来查找两个字符串是变位词还是非变位词.经典的方法是获取每个字符串的字符数组,然后比较它们,如果两个字符数组都相等,那么字符串就是变位词.但在进行比较之前,请确保两个字符串的 ...

  7. 判断两个字符串是否互为变位词

    看了个算法题目,觉得有趣,就换成了java版本的. 原文地址:blog.csdn.net/ns_code/article/details/21409663 题目: Write a method to ...

  8. 7-20 判断两个字符串是否为变位词 (10 分)如果一个字符串是 另一个字符串的重新排列组合,那么这两个字符串互为变位词。比如,”heart”与”earth”互为变位 词,”Mary”与”arMy

    7-20 判断两个字符串是否为变位词 (10 分) 如果一个字符串是 另一个字符串的重新排列组合,那么这两个字符串互为变位词.比如,"heart"与"earth" ...

  9. 浙大python判断两个字符串是否为变位词_Python实现对变位词的判断

    Python实现对变位词的判断 什么是变位词呢?即两个单词都是由相同的字母组成,而各自的字母顺序不同,譬如python和typhon,heart和earth. 变位词的判断 既然我们知道了变位词的定义 ...

  10. Java 处理字符串中的敏感词 配置模式

    最新有个小业务需要用到批量去除敏感词,调用量非常频繁且对性能要求较大,且关键字是随时会增加的,因此也就不能使用简单的替换,而是需用用到配置文件方式处理. 两个类,一段配置文件 1.初始化敏感词库,将敏 ...

最新文章

  1. Java23种设计模式学习笔记【目录总贴】
  2. C++编译 C # 调用方法
  3. python运行一个项目_Django 项目创建到启动(最全最详细的第一个项目)
  4. qemu交叉编译arm内核_arm qemu (1) 内核启动调试环境搭建
  5. java Socket 长连接 心跳包 客户端 信息收发 demo
  6. 引入外部化的配置文件
  7. 如何在Windows 10中将您喜欢的设置固定到开始菜单
  8. ssm框架简单实现文件上传
  9. linux内核工程师必须知道的三十道题
  10. (24)System Verilog设计十进制计数器
  11. cocos2d的单例
  12. java大津法确定阈值,大津法得到自适应阈值
  13. MyEclipse取消验证Js的两种方法
  14. div3 C. Dominant Piranha
  15. 杆刚度校核c语言程序,第12章杆件的强度、刚度计算.doc
  16. 重读《从菜鸟到测试架构师》-- 从专家到高手
  17. 前端学习01 HTML入门
  18. include_path='/usr/local/php7.0/lib/php (宝塔一键安装)报错解决方法
  19. Matlab sound函数播放与停止播放音频
  20. C语言程序设计:输入一个三角形的三条边长,求出三角形的面积。

热门文章

  1. [音乐]被遗弃的公主-郑丽欣
  2. 文法三、限定と非限定
  3. 推荐!帮你快速回复的神秘软件
  4. mock.js如何使用?简单易懂,一学就会,一篇文章即可出师
  5. 机械制造企业为什么要用机械行业管理系统
  6. 零基础学小程序006(后台数据的获取与解析)----请求服务器json数据展现到小程序上
  7. 思考|关于创新创业训练营结业的思考与分享
  8. 搭建cobbler自动化安装系统
  9. Java 创建文件软链接
  10. 龙市2021高考成绩查询,2021巢湖市地区高考成绩排名查询,巢湖市高考各高中成绩喜报榜单...