我正在阅读溢出多年,但从来没有发布任何东西(多亏了很好的答案)直到现在,因为我无法找到解决问题的方法。 我是PHP的新手。
所以我正在制作游戏,你必须找到一个包含12个随机生成字母的最长单词。我实际上在C#和Java中成功地做到了这一点,但现在我将一些代码移植到PHP,因为我正在处理多人游戏版本,而且有些东西将在服务器上。
所以我使用这个伟大的线程做了所有这些(Thomas Jungblut回答): Find the longest word given a collection
现在我尝试在PHP中做同样的事情但是,这对我来说很奇怪。我得到了一些疯狂的结果,我不知道如何在php中复制这个java方法:
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
我没有收到任何错误,但显然事情不起作用,有没有人可以帮我解决这个问题?
更新:顺便说一句,我知道帖子可能会让我感到困惑,因为我在这里发帖...原谅我^^ 我“修复”了代码,它现在会找到我最长的单词。但某处有错误。 Bug允许algortithm多次使用一个字符,这是不可能的。
我认为问题在于:
$newDict[$index] = array_splice($allowedCharacters, $index +1, count($allowedCharacters) - ($index +1));
这是我目前的守则:
parse_dictionary.php
<?php
$ouput = array();
$mysqli = new mysqli('localhost','root','','multiquiz_db');
$mysqli->set_charset('utf8');
if ($result = $mysqli->query("SELECT word FROM words_live")) {
while($row = $result->fetch_array(MYSQL_ASSOC)) {
//echo(mb_convert_encoding($row['word'], 'HTML-ENTITIES', 'utf-8'));
array_push($ouput, $row['word']);
}
//echo utf8_decode(json_encode($ouput));
}
$result->close();
$mysqli->close();
?>
Trie.php
<?php
class Trie
{
public $children = array();
public $value = null;
public $word = null;
public function __construct($value = null)
{
$this->value = $value;
}
public function adda($array)
{
$this->addb($array, 0);
}
public function addb($array, $offset)
{
foreach ($this->children as $child)
{
if($child->value == $array[$offset])
{
$child->addb($array, $offset + 1);
return;
}
}
$trieNode = new Trie($array[$offset]);
array_push($this->children, $trieNode);
if($offset < count($array) - 1)
{
$trieNode->addb($array, $offset+1);
}
else
{
$trieNode->word = implode(" ", $array);
}
}
}
?>
的index.php
<?php
include 'Trie.php';
include 'parse_dictionary.php';
ini_set('memory_limit', '1024M'); // or you could use 1G
header('Content-Type: text/html; charset=utf-8');
mb_internal_encoding("UTF-8");
class LongestWord
{
public $root = null;
public function __construct($ouput)
{
$this->root = new Trie();
foreach ($ouput as $word)
{
//echo($word);
//echo(str_split_unicode($word)[0]);
$this->root->adda(str_split_unicode($word));
}
}
public function search($cs)
{
return $this->visit($this->root, $cs);
}
function visit($n, $allowedCharacters)
{
$bestMatch = null;
if(count($n->children) == 0)
{
$bestMatch = $n->word;
}
foreach($n->children as $child)
{
if($this->contains($allowedCharacters, $child->value))
{
$result = $this->visit($child, $this->remove($allowedCharacters, $child->value));
if($bestMatch == null || $result != null && strlen($bestMatch) < strlen($result))
{
$bestMatch = $result;
}
}
}
return $bestMatch;
}
function remove($allowedCharacters, $value)
{
$newDict = $allowedCharacters;
if(($key = array_search($value, $newDict)))
{
unset($newDict[$key]);
}
return $newDict;
}
function contains($allowedCharacters, $value)
{
foreach($allowedCharacters as $x)
{
if($value == $x)
{
// echo $value . "=====". $x. "|||||||";
return true;
}
else
{
//echo $value . "!!===". $x. "|||||||";
}
}
return false;
}
}
function str_split_unicode($str, $l = 0) {
if ($l > 0) {
$ret = array();
$len = mb_strlen($str, "UTF-8");
for ($i = 0; $i < $len; $i += $l) {
$ret[] = mb_substr($str, $i, $l, "UTF-8");
}
return $ret;
}
return preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
}
$chars = 'IIOIOFNČGDĆJ';
$testCharacters = str_split_unicode($chars);
$lw = new LongestWord($ouput);
echo($lw->search($testCharacters));
?>
答案 0 :(得分:0)
当您使用MySQL时,这是一种让数据库服务器完成工作的方法。
这有点脏,因为你必须添加几个WHERE
条件与正则表达式匹配,这将具有相当差的性能。 (不幸的是,我无法提出一个需要所有字母的正则表达式,但我很乐意纠正。)
但是,我已经在> 200000个条目的数据库表上测试了它;它可在不到0.3秒的时间内提供结果。
SELECT word
FROM words_live
WHERE
word REGEXP "a" AND
word REGEXP "b" AND
word REGEXP "c" AND
word REGEXP "d"
ORDER BY LENGTH(word) DESC
LIMIT 1;
显然,在构造查询时,必须在PHP代码中为每个字母生成一个word REGEXP "a"
条件。
然后,查询应该只给出一个结果,即包含所有字符的数据库中最长的单词。
答案 1 :(得分:0)
我解决了这个功能的问题,完整的工作代码更新了问题
function remove($allowedCharacters, $value)
{
$newDict = [count($allowedCharacters) - 1];
$index = 0;
foreach($allowedCharacters as $x)
{
if($x != $value)
{
$newDict[$index++] = $x;
}
else
{
//we removed the first hit, now copy the rest
break;
}
}
//System.arraycopy(allowedCharacters, index + 1, newDict, index, allowedCharacters.length - (index + 1)); JAVA arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
//$newDict[$index] = array_splice($allowedCharacters, $index +1, count($allowedCharacters) - ($index +1));
//$newDict = $allowedCharacters;
return $newDict;
}
删除旧的:
{{1}}