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首元素的地址,永远都是不相等的。

posted on 2017-05-06 23:33  炮二平五  阅读(850)  评论(0编辑  收藏  举报

导航