• LeetCode --- 字符串系列 --- 数组中的字符串匹配


    数组中的字符串匹配

    题目

    给你一个字符串数组 words ,数组中的每个字符串都可以看作是一个单词。

    请你按 任意 顺序返回 words 中是其他单词的子字符串的所有单词。

    如果你可以删除 words[j] 最左侧和/或最右侧的若干字符得到 word[i]

    那么字符串 words[i] 就是 words[j] 的一个子字符串。

    提示:

    1 <= words.length <= 100

    1 <= words[i].length <= 30

    words[i] 仅包含小写英文字母。

    题目数据 保证 每个 words[i] 都是独一无二的。


    示例

    示例 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"]
    输出:[]
    

    来源:力扣(LeetCode)

    链接:https://leetcode-cn.com/problems/string-matching-in-an-array

    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


    解题思路

    1、双重循环对比,判断 `各自` 是否是 `其他元素` 的 `子元素`
    
    2、只有 `较短字符串` 才能是 `较长字符` 的 `子字符串`
    

    力扣较好题解

    1、使用 `空格` 拼接该 `字符串数组` 成为一个 `总字符串`
    
    2、循环数组,将循环到的 `字符串` 构造成一个 `全局匹配的正则`
    
    3、若在拼接后的 `总字符串` 中能够找到 `两个及以上` 的结果
       说明这个 `字符串` 是 `除自己以外某个字符串` 的 `子字符串`
    

    题解

    渐进题解 1

    // 用时一般,内存消耗一般
    执行用时: 72 ms
    内存消耗: 35 MB
    
    let stringMatching = function(words) {
        let res = []
        // 双重循环对比,各自是否是其他元素的子元素
        words.forEach((w, index) => {
            // 内循环数组取值:从外循环的序号 + 1 开始截取 words
            // 因为前面的元素已经都经过对比,不需要重复对比了
            words.slice(index + 1).forEach(ow => {
                // 只有 较短字符串 才能是 较长字符 的 子字符串
                if (w.length > ow.length) {
                    if (w.indexOf(ow) > -1) {
                        res.push(ow)
                    }
                } else {
                    if (ow.indexOf(w) > -1) {
                        res.push(w)
                    }
                }
            })
        })
        // 最后 Set 去重
        return [...new Set(res)]
    }
    

    渐进题解 2

    // 用时一般,内存消耗一般
    执行用时: 72 ms
    内存消耗: 34.6 MB
    
    let stringMatching = function(words) {
        // filter 写法
        return words.filter(w => {
            return words.some(ow => ow.indexOf(w) > -1 && w !== ow) 
        })
    }
    

    渐进题解 3

    // 用时较好,内存消耗一般
    执行用时: 64 ms
    内存消耗: 34.7 MB
    
    let stringMatching = function(words) {
        let res = []
        // 双重循环对比,各自是否是其他元素的子元素
        words.forEach(w => {
            words.forEach(ow => {
                if (w !== ow && ow.indexOf(w) > -1) {
                    res.push(w)
                }
            })
        })
        // 最后 Set 去重
        return [...new Set(res)]
    }
    

    力扣较好题解

    // 用时一般,内存消耗一般
    执行用时: 60 ms
    内存消耗: 34.1 MB
    
    let stringMatching = function(words) {
        // 使用 空格 拼接该字符串数组成为一个 总字符串
        let s = words.join(' '),
        r = {},
        res = []
        words.forEach(w => {
            // 循环数组,将循环到的 字符串 构造成一个 全局匹配的正则
            r = new RegExp(w, 'g')
            // 若在拼接后的 总字符串 中能够找到两个及以上的结果
            // 说明这个 字符串 是 除自己以外某个字符串 的子字符串
            if (s.match(r).length > 1) {
                res.push(w)
            }
        })
        return res
    }
    

  • 相关阅读:
    要对一个任意进程(包括系统安全进程和服务进程)进行指定了相关的访问权 [OpenProcessToken,LookupPrivilegeValue,AdjustTokenPrivileges]
    XPath 表达式的上下文
    Visual C++ ADO数据库编程入门
    sscanf 详细说明
    asp.net 文件下载
    [转]JavaScript 获得页面区域大小的代码
    IE与Firefox等浏览器对容器width的不同解释及解决办法
    编译Boost_1_37_0 For VS2008
    asp.net cookies
    [转]C++字符串格式化 sprintf
  • 原文地址:https://www.cnblogs.com/linjunfu/p/12786215.html
Copyright © 2020-2023  润新知