题目描述:
给定两个字符串 s
和 p
,找到 s
中所有 p
的
异位词
的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
示例 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" 的异位词。
提示:
1 <= s.length, p.length <= 3 * 104
s
和p
仅包含小写字母
上代码,拿去即可运行:
public class Anagram {
public static void main(String[] args) {
String s = "abab";
System.out.println(getAnagram(s,"ab"));
}
public static List<Integer> getAnagram(String source, String anagram) {
List<Integer> integerList = new ArrayList<>();
String[] strings = source.split("");
List<String> stringList = Arrays.asList(anagram.split(""));
Map<String, Long> resultMap = stringList.stream().collect(Collectors.groupingBy(s -> s, Collectors.counting()));
for (int i = 0; i <= (strings.length - anagram.length()); i++) {
Map<String, Long> longMap = new HashMap<>();
for (int j = i; j < (i + anagram.length()); j++) {
if (!Objects.isNull(longMap.get(strings[j]))) {
longMap.put(strings[j], longMap.get(strings[j]) + 1);
} else {
longMap.put(strings[j], 1L);
}
}
if (resultMap.equals(longMap)) {
integerList.add(i);
}
}
return integerList;
}
}
运行结果:
慢慢来才是最快的方法--天涯明月 共勉
我要刷300道算法题,第129道 。 希望自己可以坚持下去 。