字符串的排列【滑动窗口】
解题思路:
用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; } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统