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试题
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
8天前
|
C++
【力扣】2562. 找出数组的串联值
【力扣】2562. 找出数组的串联值
|
1月前
|
存储 算法
《LeetCode 热题 HOT 100》——寻找两个正序数组的中位数
《LeetCode 热题 HOT 100》——寻找两个正序数组的中位数
|
1月前
|
存储
leetcode2744. 最大字符串配对数目
leetcode2744. 最大字符串配对数目
17 0
|
1月前
|
机器学习/深度学习 NoSQL Shell
力扣刷题-翻转字符串
力扣刷题-翻转字符串
12 1
|
1月前
|
存储
力扣刷题-最大子数组和
力扣刷题-最大子数组和
10 1
|
1月前
leetcode2967. 使数组成为等数数组的最小代价
leetcode2967. 使数组成为等数数组的最小代价
20 0
|
1月前
|
算法 搜索推荐
LeetCode刷题---215. 数组中的第K个最大元素(双指针,快速选择)
LeetCode刷题---215. 数组中的第K个最大元素(双指针,快速选择)
|
27天前
|
机器学习/深度学习 算法
力扣刷题日常(一)
力扣刷题日常(一)
20 2