使用双指针法判断给定子数组是否存在于给定数组中的Go语言程序


在这篇Go语言文章中,我们将学习如何使用双指针法,结合迭代和优化迭代方法,判断给定子数组是否存在于给定数组中。数组是由相同数据类型元素组成的集合,这些元素排列在连续的内存块中,并使用索引或下标访问。

语法

func isSubarrayPresent(arr []int, sub []int) bool {…}

isSubarrayPresent() 函数用于使用双指针法判断给定子数组是否存在于给定数组中。它接受数组和子数组作为参数。

算法

  • 步骤1 − 首先,我们需要导入 fmt 包。

  • 步骤2 − 现在,创建一个 isSubarrayPresent() 函数,该函数接受整数类型的数组和子数组。此函数将返回一个布尔值,指示子数组是否存在于数组中。

  • 步骤3

    示例1 −

    如果子数组的长度为零,这意味着它是空的,并且存在于任何数组中。在这种情况下,返回 true。否则,使用 for 循环使用某些条件将子数组的元素与数组的元素进行匹配。如果子数组的所有元素都存在于数组中,则返回 true,否则返回 false。

    示例2 −

    它首先检查子数组的长度是否大于数组的长度,如果大于,则返回 false。否则,使用带有 if-else 条件的 for 循环,使用某些条件将子数组的元素与数组的元素进行匹配。如果匹配,则函数递增 j 以继续处理子数组的下一个元素。如果没有匹配,则函数将 j 重置为零,并递增 i 以继续处理数组的下一个元素。如果子数组的所有元素都存在于数组中,则返回 true,否则返回 false。

  • 步骤4 − 启动 main() 函数。在 main() 函数中,初始化数组和子数组。

  • 步骤5 − 现在,调用 isSubarrayPresent() 函数并将数组和子数组传递给它。

  • 步骤6 − 此外,使用 fmt.Println() 函数打印结果布尔值。

示例1

在这个示例中,我们将使用迭代方法定义一个 isSubarrayPresent() 函数,该函数用于使用双指针法判断给定子数组是否存在于给定数组中。

package main

import "fmt"

func isSubarrayPresent(arr []int, sub []int) bool {
   if len(sub) == 0 {
      return true
   }

   i := 0
   j := 0

   for i < len(arr) {
      if arr[i] == sub[j] {
         j++
         if j == len(sub) {
            return true
         }
      } else {
         i -= j
         j = 0
      }
      i++
   }
   return false
}

func main() {
   arr := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
   sub1 := []int{2, 3, 4}
   sub2 := []int{4, 3, 2}
   sub3 := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

   fmt.Println(isSubarrayPresent(arr, sub1)) 
   fmt.Println(isSubarrayPresent(arr, sub2)) 
   fmt.Println(isSubarrayPresent(arr, sub3)) 
}

输出

true
false
false

示例2

在这个示例中,我们将以优化的方式使用迭代方法定义一个 isSubarrayPresent() 函数,该函数用于使用双指针法判断给定子数组是否存在于给定数组中。

package main

import "fmt"

func isSubarrayPresent(arr []int, sub []int) bool {
   n := len(arr)
   m := len(sub)

   if m > n {
      return false
   }

   i := 0
   j := 0

   for i < n && j < m {
      if arr[i] == sub[j] {
         j++
      } else if j > 0 && arr[i] == sub[j-1] {
         j--
         continue
      } else {
         i = i - j
         j = 0
      }
      i++
   }
   return j == m
}

func main() {
   arr := []int{10, 20, 30, 40, 50, 60, 70, 80, 90}
   s1 := []int{40, 50, 9}
   s2 := []int{5, 2, 10}
   s3 := []int{10, 20, 30, 40, 50}
   fmt.Println(isSubarrayPresent(arr, s1))
   fmt.Println(isSubarrayPresent(arr, s2))
   fmt.Println(isSubarrayPresent(arr, s3))
}

输出

false
false
true

结论

我们已经成功编译并执行了一个 Go 语言程序,该程序使用双指针法判断给定子数组是否存在于给定数组中,并附带两个示例。在第一个示例中,我们使用了迭代方法,在第二个示例中,我们使用了优化迭代方法。

更新于:2023年4月3日

373 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告