给你一个字符串数组 words ,数组中的每个字符串都可以看作是一个单词。返回这个数组中所有的子字符串。
如果你可以删除 words[j]最左侧和/或最右侧的若干字符得到 word[i] ,那么字符串 words[i] 就是 words[j] 的一个子字符串。
示例1:
输入:words = ["mass","as","hero","superhero"]
输出:["as","hero"]
解释:"as" 是 "mass" 的子字符串,"hero" 是 "superhero" 的子字符串。
["hero","as"] 也是有效的答案。
这道题就是一个遍历+子字符串查询的问题;
基本解决思路:
- 遍历words中所有的字符串,这个是第一层遍历,把其中字符为words[i];
- 重新遍历words中所有的字符串,这是第二层遍历,记录为words[j];
- 判断 if(i !=j && words[j].contains(words[i])) 则把这个 words[i] 放到结果中
代码实现如下:
-
- import java.util.ArrayList;
- import java.util.List;
-
- class Solution1 {
- public List
stringMatching(String[] words) { -
- List
list = new ArrayList<>(words.length); - for (int i = 0; i < words.length; i++) {
-
- for (int j = 0; j < words.length; j++) {
- if (i == j) {
- continue;
- }
- if (words[j].contains(words[i])) {
- list.add(words[i]);
- break;
- }
- }
- }
- return list;
- }
- }
这样的解法耗时不是最优秀的,为了降低耗时,进一步优化,效果如下:

优化思路如下:
- 将words中所有的字符串做一次拼接,放到StringBuilder中,定义为sb;
- 拼接完成后直接判断 sb.indexOf(word[i]) != sb.lastIndexOf(word[i]) ,则把word[i]加入到结果中。
代码实现如下:
-
- import java.util.ArrayList;
- import java.util.List;
-
- class Solution {
- public List
stringMatching(String[] words) { -
- List
list = new ArrayList<>(words.length); - StringBuilder sb = new StringBuilder(3100);
- for (String word : words) {
- sb.append(word).append(',');
- }
- for (String word : words) {
- if (sb.indexOf(word) != sb.lastIndexOf(word)) {
- list.add(word);
- }
- }
- return list;
- }
- }
这道题我没有做字符串是否包含另外一个字符串的函数,核心关注遍历操作。字符串是否包含另外一个字符串后续整理算法,再提供出来。如果有好的方案,欢迎评论。