438. 找到字符串中所有字母异位词

给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。

字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。

说明:

字母异位词指字母相同,但排列不同的字符串。

不考虑答案输出的顺序。

示例 1:

输入:

s: “cbaebabacd” p: “abc”

输出:

[0, 6]

解释:

起始索引等于 0 的子串是 “cba”, 它是 “abc” 的字母异位词。

起始索引等于 6 的子串是 “bac”, 它是 “abc” 的字母异位词。

示例 2:

输入:

s: “abab” p: “ab”

输出:

[0, 1, 2]

解释:

起始索引等于 0 的子串是 “ab”, 它是 “ab” 的字母异位词。

起始索引等于 1 的子串是 “ba”, 它是 “ab” 的字母异位词。

起始索引等于 2 的子串是 “ab”, 它是 “ab” 的字母异位词。

class Solution {

    public List<Integer> findAnagrams(String s, String p) {
List<Integer> res = new ArrayList<>();
if (p.length() > s.length())
return res; int[] pLetterCounts = new int[26];
int[] sLetterCounts = new int[26];
for (int i = 0; i < p.length(); ++i) {
pLetterCounts[p.charAt(i) - 'a']++;
sLetterCounts[s.charAt(i) - 'a']++;
} for (int endIdx = p.length() - 1; endIdx < s.length(); ++endIdx) {
int startIdx = endIdx - p.length() + 1;
boolean isAnagrams = true;
for (int i = 0; i < 26; ++i) {
if (sLetterCounts[i] != pLetterCounts[i]) {
isAnagrams = false;
break;
}
} if (isAnagrams)
res.add(startIdx); if (endIdx != s.length() - 1){
sLetterCounts[s.charAt(startIdx) - 'a']--;
sLetterCounts[s.charAt(endIdx + 1) - 'a']++;
} } return res;
}
}

最新文章

  1. JavaIO之File类
  2. Android(Xamarin)之旅(五)
  3. 一个日期的下一个星期五 next_date
  4. 由一个异常开始思考springmvc参数解析
  5. fgets函数
  6. 如何在程序里模拟在cmd里用管理员权限运行一条指令
  7. NServiceBus-日志
  8. Python安装、配置
  9. DIV布局之道二:DIV块的嵌套,DIV盒子模型
  10. C#连接ACCESS的一个问题
  11. aync await 进一步探索
  12. osx mitmproxy ssl 错误
  13. 4月18开始看《C++Primer Plus》
  14. Ax用Excel导出表的字段属性信息
  15. Android开发之漫漫长途 XIX——HTTP
  16. SDWebImage代码赏析
  17. CSS 实例之翻转图片
  18. opencv-python教程学习系列9-程序性能检测及优化
  19. VIM之打开、保存文件
  20. Python操作redis字符串(String)详解 (三)

热门文章

  1. 【基础】excel如何根据数据内容显示不同颜色。
  2. Git使用教程之在github上创建项目(三)
  3. 力扣题解-面试题22. 链表中倒数第K个节点
  4. robotframework利用selenium2Library实现无界面自动化关键字
  5. Appium自动化(9) - appium元素定位的快速入门
  6. DPDK Mbuf Library(学习笔记)
  7. ABAP基础4:模块化
  8. ol,li,ul,dl,dt,dd
  9. Java 8 中如何优雅的处理集合
  10. python+selenium 自动化测试框架-学习记录