30. 串联所有单词的子串
困难
相关标签
相关企业
给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。
s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。
例如,如果 words = ["ab","cd","ef"], 那么 "abcdef", "abefcd","cdabef", "cdefab","efabcd", 和 "efcdab" 都是串联子串。 "acdbef" 不是串联子串,因为他不是任何 words 排列的连接。
返回所有串联子串在 s 中的开始索引。你可以以 任意顺序 返回答案。
class Solution {
public List<Integer> findSubstring(String s, String[] words) {
List<Integer> res = new ArrayList<Integer>();
int m = words.length, n = words[0].length(), ls = s.length();
for (int i = 0; i < n; i++) {
if (i + m * n > ls) {
break;
}
Map<String, Integer> differ = new HashMap<String, Integer>();
for (int j = 0; j < m; j++) {
String word = s.substring(i + j * n, i + (j + 1) * n);
differ.put(word, differ.getOrDefault(word, 0) + 1);
}
for (String word : words) {
differ.put(word, differ.getOrDefault(word, 0) - 1);
if (differ.get(word) == 0) {
differ.remove(word);
}
}
for (int start = i; start < ls - m * n + 1; start += n) {
if (start != i) {
String word = s.substring(start + (m - 1) * n, start + m * n);
differ.put(word, differ.getOrDefault(word, 0) + 1);
if (differ.get(word) == 0) {
differ.remove(word);
}
word = s.substring(start - n, start);
differ.put(word, differ.getOrDefault(word, 0) - 1);
if (differ.get(word) == 0) {
differ.remove(word);
}
}
if (differ.isEmpty()) {
res.add(start);
}
}
}
return res;
}
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/substring-with-concatenation-of-all-words/solutions/1616997/chuan-lian-suo-you-dan-ci-de-zi-chuan-by-244a/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这个地板不太烫
- 粉丝: 96
- 资源: 171
最新资源
- 基于Matlab界面GUI设计的口罩识别预警[Matlab界面GUI设计].zip
- 基于Matlab界面GUI设计的卡尔曼小球运动跟踪[Matlab界面GUI设计].zip
- Rust编程语言入门教程的学习代码
- 内存检测工具,asan需要的动态库
- 运维系列:从csdn搬家到博客园(完整教程)
- Yakka is a Chess Engine written in object pascal (Delphi)
- 运维系列:csdn博客搬家:及其方便的博客迁移、搬家工具,支持主流博客平台-CsdnSyncHexo
- C#中的Entity Framework:数据持久化的艺术
- Python高分毕设-基于深度学习的水果识别系统的源码+文档说明+数据集+模型
- 计算机考研统考专业课408中需要经常复习的题目的平台
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈