【字符串】数组中的字符串匹配

题目描述

给你一个字符串数组 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;
    }
}

这样的解法耗时不是最优秀的,为了降低耗时,进一步优化,效果如下:

【字符串】数组中的字符串匹配_第1张图片

优化思路如下:

  • 将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;
    }
}

总结 

这道题我没有做字符串是否包含另外一个字符串的函数,核心关注遍历操作。字符串是否包含另外一个字符串后续整理算法,再提供出来。如果有好的方案,欢迎评论。

 

你可能感兴趣的:(算法与数据结构,java,开发语言,leetcode)