0

我正在开发一个类似于 Google的“你的意思是…… ”系统!拼写部分很简单(使用 PHP 的 pspell 库),但我无法解决的是大小写问题。

假设拼写错误的单词是“GoVeNMeNt”,那么正确的单词应该是“GoVerNMeNt”(类似于 Google),但 pspell 库仅以一种情况(通常为小写)给出建议。

那么如何编写一个transformCase接收实际字符串($string)和建议字符串($subject)的函数呢?我编写了以下不处理所有情况的实现:

function transformCase($string,$subject){
    for ($i=0,$marker=0;$i<strlen($string);++$i)
        if (strcasecmp($string[$i],$subject[$marker])==0){
            $subject[$marker]=$string[$i];
            $marker+=1;
        }
        elseif (strlen($string)==strlen($subject))
            $marker+=1;
    return $subject;
}
echo transformCase("AbSaNcE",'absence')."\n";  # AbSeNcE :)
echo transformCase("StRioNG",'string')."\n";   # StRiNG  :)
echo transformCase("GOVERMENt",'government')."\n"; # GOVERNment :<

在最后一种情况下,输出应该是 GOVERnMENt。该算法也不适用于各种其他查询。

因此,如果有人帮助我使用算法,我会很高兴:)

4

1 回答 1

0

尝试对您的算法进行下一次修改:

function transformCase($string,$subject) {
    for ($i=0,$marker=0;$i<strlen($string);++$i) {
        if (strcasecmp($string[$i],$subject[$marker])==0) {
            $subject[$marker]=$string[$i];
            $marker+=1;
        }
        // Look for the next same character in $string
        while (strcasecmp($string[$i],$subject[$marker])!=0) {
            $i+=1;
        }
    }
    return $subject;
}

比较elseif (strlen($string)==strlen($subject))不保证该功能可以按您的需要工作。否则,您可以引入其他修改以获得最佳性能。

于 2020-01-06T06:36:41.827 回答