【字符串全排列】LeetCode 567. Permutation in String

Solution1:【超时,未能AC】
得到s1的所有全排列组合,然后在s2中查找s1的全排列集合
因为超时,未能AC,只是记录一下:
【注意】此题中针对字符串的全排列代码非常之经典!应当牢记!

class Solution {
public:bool checkInclusion(string s1, string s2) {vector<string> s1_per = permute(s1);for(auto a : s1_per) {if(s2.find(a) != string::npos)return true;}return false;}vector<string> permute(string& str) {if (str.empty()) return vector<string>(1, "");vector<string> res;string first(1, str[0]);str.erase(0, 1);vector<string> words = permute(str);for (auto &a : words) {for (int i = 0; i <= a.size(); ++i) {a.insert(i, first);res.push_back(a);a.erase(i, 1);}}   return res;}
};

Solution2:
我们先来看使用两个哈希表来做的情况,我们先来分别统计s1和s2中前n1个字符串中各个字符出现的次数,其中n1为字符串s1的长度,这样如果二者字符出现次数的情况完全相同,说明s1和s2中前n1的字符互为全排列关系,那么符合题意了,直接返回true。如果不是的话,那么我们遍历s2之后的字符,对于遍历到的字符,对应的次数加1,由于窗口的大小限定为了n1,所以每在窗口右侧加一个新字符的同时就要在窗口左侧去掉一个字符,每次都比较一下两个哈希表的情况,如果相等,说明存在,参见代码如下:
代码:
不得不说,算法真是牛逼啊。。

class Solution {
public:bool checkInclusion(string s1, string s2) {int n1 = s1.size(), n2 = s2.size();vector<int> m1(128), m2(128);for (int i = 0; i < n1; ++i) {++m1[s1[i]]; ++m2[s2[i]];}if (m1 == m2) return true;for (int i = n1; i < n2; ++i) {++m2[s2[i]];--m2[s2[i - n1]];if (m1 == m2) return true;}return false;}
};

20180708更:
可以!

class Solution {
public:bool checkInclusion(string s1, string s2) {int n1 = s1.size(), n2 = s2.size();if (n1 > n2) return false;vector<int> hash_s1(256, 0), hash_s2(256, 0);for (int i = 0; i < n1; i++) {hash_s1[s1[i]]++;hash_s2[s2[i]]++;}if (hash_s1 == hash_s2) return true;for (int i = n1; i < n2; i++) {hash_s2[s2[i]]++;hash_s2[s2[i-n1]]--;if (hash_s1 == hash_s2)return true;}return false;}
};

【字符串全排列】LeetCode 567. Permutation in String相关推荐

  1. leetcode 567. Permutation in String 字符串的排列 滑动窗口法

    题目 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列.换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1:输入: s1 = "ab" s ...

  2. LeetCode 76. Minimum Window Substring / 567. Permutation in String

    76. Minimum Window Substring 典型Sliding Window的问题,维护一个区间,当区间满足要求则进行比较选择较小的字串,重新修改start位置. 思路虽然不难,但是如何 ...

  3. 字符串全排列的问题 python和c语言实现

    前言 这是一个的经典的问题 设计一个算法,输出一个字符串字符的全排列. 比如,String = "abc" 输出是"abc","bac",& ...

  4. 【数字全排列】LeetCode 60. Permutation Sequence

    LeetCode 60. Permutation Sequence Solution0: 偷鸡摸狗的做法 class Solution {public:string getPermutation(in ...

  5. [Leetcode][第557题][JAVA][反转字符串中的单词 III][遍历][String函数]

    [问题描述][简单] [解答思路] 1. 遍历 开辟一个新字符串.然后从头到尾遍历原字符串,直到找到空格为止,此时找到了一个单词,并能得到单词的起止位置.随后,根据单词的起止位置,可以将该单词逆序放到 ...

  6. 面试题28:字符串全排列

    字符串全排列是面试中常考的问题,一定要掌握 这题没写出来,思路就是把第一个字符和后面所有字符交换,然后递处理后面n-1个,最后需要在调用交换函数换回原始字符串 1 #include<iostre ...

  7. 字符串全排列算法_C#版_剑指OFFER

    字符串全排列算法_C#版_剑指OFFER 题目描述 ​题目描述 输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组. 例如输入字符串ABC,则输出由字符A, ...

  8. 求字符串全排列的递归算法

    求字符串全排列的递归算法 void permutation(char * p_str, char * p_begin) { if(!p_str || !p_begin) { return; } if( ...

  9. Leetcode 1370. Increasing Decreasing String

    Leetcode 1370. Increasing Decreasing String 题目链接: Increasing Decreasing String 难度:easy 题目大意: 按照题目要求对 ...

最新文章

  1. Kafka官方文档翻译——简介
  2. 如何在tensorflow2环境运行tensorflow1代码
  3. n个节点的二叉树n+1_使用C ++程序将链接列表中的最后N个节点附加到第一个
  4. Java学习进阶—高级编程
  5. CentOS配置ssh无密码登录的注意点
  6. 淘宝设计万能PSD分层模板(简约页面设计——少即是多)
  7. 1.C#基础学习笔记3---C#字符串(转义符和内存存储无关)
  8. 软件工程学习之七大实际开发模型的讲解,及模块化设计的理念
  9. 华为usb 无线网卡 linux,Linux下使用华为h3c Aolynk WuB320G无线网卡
  10. 服务器驱动文件丢失恢复教程,服务器驱动丢失。
  11. 贫困的苏州(转自新浪)
  12. TAPD项目管理:工作流自动化最佳实践
  13. 今天写好汇报材料,明天升职加薪~
  14. MySQL 数据库语句基础
  15. 设置壁纸(静态壁纸)
  16. 绿幕换背景、绿幕视频实时换背景
  17. 将头像、文字和二维码三部分,合成一张宣传图片
  18. Oracle-高效分页
  19. 视频教程-区块链技术原理精讲-区块链
  20. Spring Cloud 入门教程(二): 配置管理

热门文章

  1. qt 编译成apk_GitHub - qtxtz/AndroidMerageAPK: 实现android自动打包的程序
  2. linux程序中expr是什么意思,Linux中expr命令 (转)
  3. vscode更改配置文件路径_VsCode的jsconfig配置文件说明详解
  4. android view绘制速度,关于android ui的优化 view 的绘制速度
  5. sql语句distinct_带DISTINCT子句SQL SELECT语句
  6. web界面设计工具_您应该了解的14个Web设计工具
  7. node js 非阻塞io_Node Express JS:套接字IO模块示例
  8. android浮动按钮_Android浮动操作按钮示例教程
  9. sql 教程_SQL
  10. angular 手动注入_手动引导Angular JS应用程序