zoukankan      html  css  js  c++  java
  • leetcode 567. Permutation in String

    leetcode 567. Permutation in String

    很水的一道题目。。参考了

    http://blog.csdn.net/xiaocong1990/article/details/71249141

    一开始我也是用一个a[256]保存,然后遍历s2,发现a[s[i]]不为不为零就开始用help函数查找,看看是否能随着临时pos++下去让num==s1.length(),不能就还原a数组,继续遍历s2,时间复杂度差不多是O(s1.length()*s2.length()) 然后如此暴力的方法果然tle了。。

    应该用一个滑动窗口进行滑动来设计算法。。

    于是用一个类似于滑动窗口的区间去统计此区间内的字符,区间的长度取为s1的长度。

    如果在s2中存在一个区间,里面的字符与s1的字符全部都一样,则说明s1通过全排列后一定能够得到s2中的子串。也即满足题意

    ac代码非常简单

     1 class Solution {
     2 public:
     3     bool checkInclusion(string s1, string s2) {
     4         int m=s1.length();
     5         int n=s2.length();
     6         if(m>n) return false;
     7         vector<int> map1(26),map2(26);
     8         for(int i=0;i<m;i++){
     9             map1[s1[i]-'a']++;
    10             map2[s2[i]-'a']++;
    11         }
    12         if(map1==map2) return true;
    13         for(int i=0;i+m<n;i++){
    14             map2[s2[i]-'a']--;
    15             map2[s2[i+m]-'a']++;
    16             if(map1==map2) return true;
    17         }
    18         return false;
    19     }
    20 };

    这里有一个地方值得注意,就是代码中vector来保存,用STL的vector的map1和map2进行直接的比较,这里的vector的优越性比数组好多了。因为我刚刚试了一下如果是数组a[26]和b[26]是不能直接比较的,因为a==b的比较是比较的是a和b首元素的地址,永远都是不相等的。

  • 相关阅读:
    LeetCode(62)Unique Paths
    4_蒙特卡罗算法求圆周率PI
    CentOS安装sctp协议
    3_寻找假币问题(分治法)
    Gdb调试命令
    高阶函数 -------JavaScript
    方法 -------JavaScript
    函数定义和调用 -------JavaScript
    iterable -------JavaScript
    Map和Set -----JavaScript
  • 原文地址:https://www.cnblogs.com/weedboy/p/6819151.html
Copyright © 2011-2022 走看看