IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 单词接龙【php版】 -> 正文阅读

[PHP知识库]单词接龙【php版】

在这里插入图片描述
方法1 ,BFS法(单向),通过添加虚拟结点建图
如下图所示,虚线框中便是添加的虚拟结点,由于添加了虚拟结点,最后求出的最短路径要除2,再加上首结点的贡献1,如hit-》hot ,最短路径为2, 但因为虚拟结点的存在,变成 2 / 2 + 1
在这里插入图片描述

class Solution {

	private $mpWord2inx = [];
	private $mpIdx2Edge = [];
	private $cntWords = -1;

	/**
	 * BFS法(单向),通过添加虚拟结点建图,将每个单词看作一个点,如果两个单词间可以通过一个字符的变换来互换,则它们
	 * 之间存在一条边
	 * @param String $beginWord
	 * @param String $endWord
	 * @param String[] $wordList
	 * @return Integer
	 */
	function ladderLength($beginWord, $endWord, $wordList) {
		if (count($wordList) == 0) {
			return 0;
		}
		foreach ($wordList as $word) {
			$this->addWord($word);
			$indexWord = $this->mpWord2inx[$word];
			$this->addEdge($word, $indexWord);
		}
		// 如果word本身不在wordList中
		if (!array_key_exists($endWord, $this->mpWord2inx)) {
			return 0;
		}
		// 将beginWord加入
		$this->addWord($beginWord);
		$indexBgn = $this->mpWord2inx[$beginWord];
		$this->addEdge($beginWord, $indexBgn);
		// 存储beginWord 到各个 字符的路径长度
		$roadCnt = array_fill(0, $this->cntWords+1, -1);
		$roadCnt[$indexBgn] = 0;
		$queue = new SplQueue();
		$queue->enqueue($indexBgn);
		$indexEnd = $this->mpWord2inx[$endWord];
		while (!$queue->isEmpty()) {
			$curIdx = $queue->dequeue();
			if ($curIdx == $indexEnd) {
				return $roadCnt[$curIdx] / 2 + 1;
			}
			foreach ($this->mpIdx2Edge[$curIdx] as $idx => $flg) {
				// 说明不是回头路
				if ($roadCnt[$idx] === -1) {
					$roadCnt[$idx] = $roadCnt[$curIdx] + 1;
					$queue->enqueue($idx);
				}
			}
		}
		return 0;
	}

	private function addEdge($word, $index) {
		$this->mpIdx2Edge[$index] = array();
		$strLen = strlen($word);
		while ($strLen-- > 0) {
			$charTemp = $word[$strLen];
			// 将字符换成 xxx*xx形式,如cat换成*at、 c*t、 ca*;
			$word[$strLen] = '*';
			$this->addWord($word);
			$indexNew = $this->mpWord2inx[$word];
			// 表示word与其各种变体之间可以互通
			$this->mpIdx2Edge[$indexNew][$index] = 1;
			$this->mpIdx2Edge[$index][$indexNew] = 1;
			$word[$strLen] = $charTemp;
		}
	}
	/**
	 * 添加字符串与其id的映射
	 * @param $word
	 */
	private function addWord($word) {
		if (!array_key_exists($word, $this->mpWord2inx)) {
			$this->mpWord2inx[$word] = ++$this->cntWords;
		}
	}
}

提交结果如下:
在这里插入图片描述

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-07-24 11:13:11  更:2021-07-24 11:13:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 15:36:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码