使用龟兔赛跑故事讲解-算法是一种思想-一个故事就是一个思想

当然,我们可以使用“龟兔赛跑”的故事来形象地解释这段代码是如何工作的,尽管在这个场景中,“龟”和“兔”的角色会稍微有些不同,但它们仍然能帮助我们理解滑动窗口算法的核心思想。

龟兔赛跑故事版滑动窗口算法

在这个故事中,我们不再直接比较速度,而是将“龟”和“兔”视为滑动窗口的两个边界:

  • “龟”:代表滑动窗口的左边界(left),它移动得相对较慢,只有在确保窗口内的字符满足特定条件时才会向前移动。
  • “兔”:代表滑动窗口的右边界(right),它积极地向前探索,试图找到包含所有目标字符(来自字符串t)的最小子串。
故事开始

假设你有一个长长的赛道(字符串s),赛道上散落着各种颜色的石头(字符)。你的目标是找到赛道上的一段最短路程,这段路程上包含了所有你需要的特定颜色石头(来自字符串t)。

赛跑过程
  1. 初始准备
    • 你首先统计了所有需要的石头颜色及其数量(need哈希表)。
    • 你还准备了一个窗口(window哈希表)来记录当前窗口内每种颜色石头的数量。
  2. 兔子开始探索:
    • 兔子(right)开始在赛道上向前跳跃,每跳到一个新位置,就检查那里的石头颜色是否是你需要的。
    • 如果是,兔子就告诉窗口(window哈希表)增加这种颜色的石头数量,并检查是否已经达到了所需的数量(valid计数器增加)。
  3. 检查窗口是否满足条件
    • 当窗口内的石头颜色种类和数量都满足要求时(valid等于need的大小),你开始考虑是否找到了一个更短的路程。
    • 你用“龟”的位置(left)来标记这个可能的最短路程的起点,并记录下这个路程的长度。
  4. 龟开始移动:
    • 既然你已经找到了一个满足条件的路程,现在你想看看是否可以通过移动“龟”来缩短这个路程。
    • “龟”开始向前移动(left增加),同时窗口(window哈希表)更新以反映“龟”离开窗口后的情况。
    • 如果“龟”离开的石头颜色是你需要的,并且窗口内这种颜色的石头数量刚好减少到所需数量以下,那么valid计数器就减少。
  5. 重复过程
    • 兔子继续向前跳跃,而龟则根据需要移动,以寻找更短的路程。
    • 这个过程一直持续到兔子到达赛道的尽头。
故事结束

当兔子到达赛道的尽头时,你已经找到了包含所有所需石头颜色的最短路程(或确定这样的路程不存在)。

回到代码

在代码中,left 和 right 指针分别扮演了“龟”和“兔”的角色,而 window 和 need 哈希表则帮助你跟踪窗口内的石头颜色及其数量。通过不断地移动这两个指针并更新相关数据,你最终能够找到满足条件的最小子串。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您介绍一下 Java 编写的龟兔赛跑模拟。 首先,我们需要定义两个角色——乌龟和兔子,他们的基本属性包括速度、位置等信息。可以用一个类来表示他们: ```java public class Animal { private String name; // 名称 private int speed; // 速度 private int position; // 位置 // 构造函数 public Animal(String name, int speed) { this.name = name; this.speed = speed; this.position = 0; } // 睡觉 public void sleep() { System.out.println(name + "在睡觉..."); } // 行动 public void move() { int distance = speed; // 行进距离等于速度 position += distance; // 更新位置 System.out.println(name + "跑了" + distance + "米,当前位置:" + position + "米"); } // 获取位置 public int getPosition() { return position; } } ``` 接下来,我们需要模拟比赛的场景。可以使用一个类来表示比赛,包括两个角色和比赛的逻辑: ```java public class Race { private Animal tortoise; // 乌龟 private Animal hare; // 兔子 // 构造函数 public Race() { tortoise = new Animal("乌龟", 5); hare = new Animal("兔子", 10); } // 开始比赛 public void start() { int totalDistance = 100; // 总距离 while (tortoise.getPosition() < totalDistance && hare.getPosition() < totalDistance) { tortoise.move(); hare.move(); if (hare.getPosition() - tortoise.getPosition() > 10) { tortoise.sleep(); // 兔子领先10米以上,乌龟睡觉 } } System.out.println("比赛结束,"); if (hare.getPosition() >= totalDistance && tortoise.getPosition() >= totalDistance) { System.out.println("双方同时到达终点,平局!"); } else if (hare.getPosition() >= totalDistance) { System.out.println("兔子获胜!"); } else { System.out.println("乌龟获胜!"); } } } ``` 最后,我们可以在 `main()` 函数中创建比赛对象并开始比赛: ```java public static void main(String[] args) { Race race = new Race(); race.start(); } ``` 这样,我们就成功地用 Java 编写了一个龟兔赛跑模拟程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值