字符串的排列【滑动窗口】
解题思路:
用map存入窗口中26个字母的次数
滑动维护对比即可
写的有点复杂,看了一下题解,用的是vector对比,发现vector的对比的写法还不会,记录一下,简单很多
map写法
class Solution { public: bool checkInclusion(string s1, string s2) { map<int,int>mp1; map<int,int>mp2; int left=0; int right=s1.length()-1; int len; if(s1.length()>s2.length()){ return false; } if(s1==s2){ return true; } for(int i=0;i<s1.length();i++){ mp1[s1[i]]++; mp2[s2[i]]++; } int flag=0; while(right<s2.length()&&!flag){ flag=1; len=0; for(int i='a';i<='z';i++){ if(mp1[i]!=mp2[i]){ flag=0; len=len+abs(mp1[i]-mp2[i]); } } if(flag==1){ return true; } len=len/2; if(len==0||right+len>s2.length()){ break; } for(int i=left;i<left+len;i++){ mp2[s2[i]]--; } left=left+len; for(int i=right+1;i<=right+len;i++){ mp2[s2[i]]++; } right=right+len; } return false; } };
vector写法
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);//必须用(26)这种指定vector的大小才可以直接对比 vector<int>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; } };