LeetCode
来源:互联网 发布:mac用的office 编辑:程序博客网 时间:2024/06/07 19:00
解题代码:
438:
classSolution {
public:
vector<int> findAnagrams(string s,string p) {
vector<int> res;
vector<int> pp(26,0),ss(26,0);
if(p.size()>s.size())
return res;
for(int i=0;i<p.size();i++){
pp[p[i]-'a']++;
ss[s[i]-'a']++;
}
if(pp==ss)
res.push_back(0);
for(int i=p.size();i<s.size();i++){
ss[s[i]-'a']++;
ss[s[i-p.size()]-'a']--;
if(pp==ss)
res.push_back(i-p.size()+1);
}
return res;
}
};
567:
classSolution {
public:
bool checkInclusion(string s1, string s2) {
if(s2.size()<s1.size())
return false;
vector<int> s(26,0),t(26,0);
for(int i=0;i<s1.size();i++){
s[s1[i]-'a']++;
t[s2[i]-'a']++;
}
if(s==t)
return true;
for(inti=s1.size();i<s2.size();i++){
t[s2[i]-'a']++;
t[s2[i-s1.size()]-'a']--;
if(s==t)
return true;
}
return false;
}
};
解题思路:
将这两题放在一起的原因是两题比较相似,都是关于一个字符串中是否存在另一个字符串的其他排列。不同的是,567只需要判断是否存在,而438需要找出位置。
由于字符串只包含小写字母,因此,建立两个长度为26的数组,分别对应26位小写字母。由于只需要求是否存在相应的排列,所以也相当于求包含对应字母的数量是否相等。先把字符串一中各个字母的个数记录于数组一,假设字符串一长度为k,先把字符串二中前k个字符的字母个数情况输入数组二中,然后进行对比,若两个数组相同,则表示字符串二的前k位是字符串一的另一种排列方式或相同。若不相同则表示不是。然后从字符串二的第k+1位开始,逐个添加对应字母的个数,假设为第i位,并减去第i-k的字母,保证数组二中表示的是连续的k个字符的字母个数情况。而且进行两个数组间的对比。
- leetcode
- [leetcode]
- LeetCode
- leetcode
- leetcode
- leetcode:
- leetcode:
- LeetCode
- leetcode
- LEETCODE
- leetcode
- leetCode
- leetcode
- [leetcode]
- LeetCode
- leetcode
- leetcode:
- leetcode
- 解决 Bash On Windows 无法下载(慢)
- ElasticSearch Java Api(四) -删除索引
- LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal
- Android四大组件及Intent
- POI 自定义16进制颜色导出
- LeetCode
- 经典问题a+=b和a=a+b
- Torch
- MFC模态对话框和非模态对话框及副窗口调用主窗口控件 自定义消息发送
- 关于弱网测试的一些要点,供测试的朋友们进行参考
- SIGHUP
- vivo部分笔试题(2017提前批)
- 冒泡排序算法
- 【cc2541历程】ds18B20