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<String> stringMatching(String[] words) {
        /*先排序再暴力*/
        /*使用字符串的长度对字符串数组进行排序*/
        Arrays.sort(words, new java.util.Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                if (o1.length() != o2.length()) return o1.length() - o2.length();
                return o1.compareTo(o2);
            }
        });
        List<String> 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<String> stringMatching(String[] words) {
        /*下面使用的是java8 的lamada语法进行排序*/
        Arrays.sort(words, (String x, String y)->x.length() - y.length());
        List<String> 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<String> stringMatching(String[] words) {
        List<String> 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;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值