我已经制定了一种简单的算法来检测句子是否为等距图(单词或短语不带重复字母)。算法非常简单-只是将每个字母相互比较。
<?php
function isIsogram(string $_s) : bool
{
$_s = mb_strtoupper($_s, 'utf-8');
$isogram = true;
for ($i = 0; $i < mb_strlen($_s); $i++) {
for ($j = $i + 1; $j < mb_strlen($_s) - 1; $j++) {
if ($_s[$i] == $_s[$j]) {
$isogram = false;
}
}
}
return $isogram;
}
这适用于除德语字母以外的所有测试用例:
public function testWorksWithGermanLetters()
{
$this->assertTrue(isIsogram('Heizölrückstoßabdämpfung'));
}
另一种算法(由别人制作)可以正常工作:
<?php
function isIsogram($input)
{
$input = preg_split('//u', preg_replace('/-| /', '', mb_strtolower($input)), -1, PREG_SPLIT_NO_EMPTY);
if(count(array_unique($input)) == count($input))
return true;
return false;
}
为什么?
答案 0 :(得分:1)
这是一个编码问题。一种简单的解决方案是使用mb_substr
而不是数组符号。
function isIsogram(string $_s) : bool {
$_s = mb_strtoupper($_s, 'utf-8');
for ($i = 0; $i < mb_strlen($_s); $i++) {
for ($j = $i + 1; $j < mb_strlen($_s); $j++) {
if (mb_substr($_s, $i, 1) == mb_substr($_s, $j, 1)) {
return false;
}
}
}
return true;
}
顺便说一句。如果您找到了第一个匹配的字符串,并且还错过了最后一个字符(-1
是错误的),则可能会中断循环。