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