leetcode-每日一题1408. 数组中的字符串匹配(暴力枚举)和Golang里关于Index方法和Contains方法区别

简介: 题目要求我们找到字符串数组中存在字符串是其他单词的子字符串,看到题目给我们的n的范围是[1,100],所以我们可以通过暴力枚举用两个for循环一层指子串一层指找存在这个子串的单词,找到则找下个一个子串

6ba3462d6b0e437fbc6d892b762d507e.png


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


思路


方法一、暴力枚举


直接想法

题目要求我们找到字符串数组中存在字符串是其他单词的子字符串,看到题目给我们的n的范围是[1,100],所以我们可以通过暴力枚举用两个for循环一层指子串一层指找存在这个子串的单词,找到则找下个一个子串


代码示例


func stringMatching(words []string) (ans []string) {
    for i, x := range words{
        for j, y := range words{
            if i != j && strings.Contains(y, x){ //strings.Index(y, x) >= 0
                ans = append(ans, x)
                break
            }
        }
    }
    return 
}


注意:Index方法和Contains方法在这里的速度和效率是一样的,Contains的源码里是直接调用的Index方法,所以二者其实本质上都是Index方法,Index方法的内部其实也是用暴力求解,但是不同的是,他有偷懒且灵巧机制,不是纯暴力求,有兴趣的可以去Index的源码看看


671a8b8aa02c43919257f73eb6e2c7bf.png


复杂度分析


  • 时间复杂度:O(n2),其中n表示字符串数组的长度,需要用到两个for循环
  • 空间复杂度:O(1),不需要额外申请空间


方法二、暴力枚举


直接思想


这个方法是从leetcode其他ac人看到的,本质上也是暴力枚举,但是不同的是,先把字符串数组按照长度从长到短排序,然后只需要去找后面比自己短的子串是不是包含在自己当中即可


代码示例


func stringMatching(words []string) []string {
  sort.Slice(words, func(i, j int) bool {
    return len(words[i]) < len(words[j])
  })
  n := len(words)
  var res []string
  for i := 0; i < n; i++ {
    for j := i + 1; j < n; j++ {
      if strings.Index(words[j], words[i]) >= 0 {
        res = append(res, words[i])
        break
      }
    }
  }
  return res
}

55c81396c8d64b86936dcd1002de947a.png


复杂度分析


  • 时间复杂度:O(n logn + n2),其中n表示字符串数组的长度,对字符串数组排序需要O(n logn)的时间,查找子串需要O(n2)的时间


  • 空间复杂度:O(1),不需要额外申请空间
目录
相关文章
|
1月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
38 0
|
3月前
|
算法
LeetCode第53题最大子数组和
LeetCode第53题"最大子数组和"的解题方法,利用动态规划思想,通过一次遍历数组,维护到当前元素为止的最大子数组和,有效避免了复杂度更高的暴力解法。
LeetCode第53题最大子数组和
|
2月前
|
Go
Golang的math包常用方法
这篇文章介绍了Golang的math包中的常量和常用方法,并通过示例代码展示了如何使用这些常量和方法。
176 87
Golang的math包常用方法
LeetCode------找到所有数组中消失的数字(6)【数组】
这篇文章介绍了LeetCode上的"找到所有数组中消失的数字"问题,提供了一种解法,通过两次遍历来找出所有未在数组中出现的数字:第一次遍历将数组中的每个数字对应位置的值增加数组长度,第二次遍历找出所有未被增加的数字,即缺失的数字。
|
1月前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
19 4
|
1月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
18 0
Leetcode第三十三题(搜索旋转排序数组)
|
1月前
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
57 0
|
1月前
|
C++
【LeetCode 12】349.两个数组的交集
【LeetCode 12】349.两个数组的交集
16 0
|
3月前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
|
3月前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置