1408 数组中的字符串匹配(暴力)

1. 问题描述:

给你一个字符串数组 words ,数组中的每个字符串都可以看作是一个单词。请你按 任意 顺序返回 words 中是其他单词的子字符串的所有单词。

如果你可以删除 words[j] 最左侧和/或最右侧的若干字符得到 word[i] ,那么字符串 words[i] 就是 words[j] 的一个子字符串。

示例 1:

输入:words = ["mass","as","hero","superhero"]
输出:["as","hero"]
解释:"as" 是 "mass" 的子字符串,"hero" 是 "superhero" 的子字符串。
["hero","as"] 也是有效的答案。
示例 2:

输入:words = ["leetcode","et","code"]
输出:["et","code"]
解释:"et" 和 "code" 都是 "leetcode" 的子字符串。
示例 3:

输入:words = ["blue","green","bu"]
输出:[]

提示:

1 <= words.length <= 100
1 <= words[i].length <= 30
words[i] 仅包含小写英文字母。
题目数据 保证 每个 words[i] 都是独一无二的。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-matching-in-an-array

2. 思路分析:

① 题目不难理解,一开始比较容易想到是暴力破解,主要是使用字符串的数量并不是太多,所以使用暴力还是可以解决的,使用暴力破解需要解决的一个问题是字符串数组的排序问题,因为排好序之后我们才能够根据字符串的长度来检查当前的字符串是否是更长字符串的子串,第一种方法使用的是Arrays.sort()方法,里面传入字符串排序比较的规则,第二种可以使用java中的lamada表达式来对字符串数组进行排序

② 除了使用上面的暴力破解之外,在领扣中发现一个想法还是很好的题解,他的做法是先遍历字符串数组使用逗号将其连接起来,假如当前的字符串是其他字符串的子串的话那么使用StringBuilder的indexOf与lastIndexOf返回字符串出现的索引的时候是不一样的,因为这个字符串至少出现了两次

3. 代码如下:

我自己写的:

class Solution {
    public List stringMatching(String[] words) {
        /*先排序再暴力*/
        /*使用字符串的长度对字符串数组进行排序*/
        Arrays.sort(words, new java.util.Comparator() {
            @Override
            public int compare(String o1, String o2) {
                if (o1.length() != o2.length()) return o1.length() - o2.length();
                return o1.compareTo(o2);
            }
        });
        List res = new ArrayList<>();
        for (int i = 0; i < words.length; ++i){
            for (int j = i + 1; j < words.length; ++j){
                if (words[i].length() != words[j].length() && words[j].contains(words[i]) && !res.contains(words[i])){
                    res.add(words[i]);
                    break;
                }
            }
        }
        return res;
    }
}

lamda语法:

class Solution {
     public List stringMatching(String[] words) {
        /*下面使用的是java8 的lamada语法进行排序*/
        Arrays.sort(words, (String x, String y)->x.length() - y.length());
        List res = new ArrayList<>();
        for (int i = 0; i < words.length; ++i){
            for (int j = i + 1; j < words.length; ++j){
                if (words[i].length() != words[j].length() && words[j].contains(words[i]) && !res.contains(words[i])){
                    res.add(words[i]);
                    break;
                }
            }
        }
        return res;
    }
}

领扣题解的:

class Solution {
    public List stringMatching(String[] words) {
        List list = new ArrayList<>();
        if (words.length == 0) return list;
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < words.length; i++){
            String str = words[i];
            builder.append(str + ",");
        }

        for (int i = 0; i < words.length; i++){
            String str = words[i];
            if (builder.toString().indexOf(str) != builder.toString().lastIndexOf(str)) list.add(str);
        }
        return list;
    }
}

 

你可能感兴趣的:(领扣)