加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 如何使用可互换字母获取单词的所有可能变体?

发布时间:2020-12-13 13:26:15 所属栏目:PHP教程 来源:网络整理
导读:在阿拉伯语中,像“?”(Alef)这样的字母有很多形式/变体: (?,?,?,?) 也是字母?的情况相同,也可能是?. 我想要做的是获得一个单词的所有可能的变化与许多?和?字母. 例如,“???”这个词应该包含所有这些(大多数情况下都是不正确的)变体:???,???,???,???,???,??
在阿拉伯语中,像“?”(Alef)这样的字母有很多形式/变体:

(?,?,?,?)

也是字母?的情况相同,也可能是?.

我想要做的是获得一个单词的所有可能的变化与许多?和?字母.

例如,“???”这个词应该包含所有这些(大多数情况下都是不正确的)变体:???,???,???,???,???,???,???……等等.

为什么?我正在构建一个小的文本更正系统,可以处理语法错误并用正确的单词替换错误的单词.

我一直试图以最干净的方式做到这一点,但我最终得到一个8 for / foreach循环只是为了处理“?”这个词

必须有一个更好的更干净的方式来做到这一点!有什么想法吗?

这是我的代码到目前为止:

$alefVariations = ['?','?','?','?'];
        $word = '??????';

        // Break into letters
        $wordLetters = preg_split('//u',$word,null,PREG_SPLIT_NO_EMPTY);
        $wordAlefLettersIndexes = [];

        // Get the ? letters
        for($letterIndex = 0; $letterIndex < count($wordLetters); $letterIndex++){
            if(in_array($wordLetters[$letterIndex],$alefVariations)){
                $wordAlefLettersIndexes[] = $letterIndex;
            }
        }

        $eachLetterVariations = [];
        foreach($wordAlefLettersIndexes as $alefLettersIndex){
            foreach($alefVariations as $alefVariation){
                $wordCopy = $wordLetters;
                $wordCopy[$alefLettersIndex] = $alefVariation;

                $eachLetterVariations[$alefLettersIndex][] = $wordCopy;
            }
        }

        $variations = [];
        foreach($wordAlefLettersIndexes as $alefLettersIndex){
            $alefWordVariations = $eachLetterVariations[$alefLettersIndex];

            foreach($wordAlefLettersIndexes as $alefLettersIndex_inner){
                if($alefLettersIndex == $alefLettersIndex_inner) continue;

                foreach($alefWordVariations as $alefWordVariation){
                    foreach($alefVariations as $alefVariation){
                        $alefWordVariationCopy = $alefWordVariation;
                        $alefWordVariationCopy[$alefLettersIndex_inner] = $alefVariation;

                        $variations[] = $alefWordVariationCopy;
                    }
                }
            }
        }

        $finalList = [];
        foreach($variations as $variation){
            $finalList[] = implode('',$variation);
        }

        return array_unique($finalList);
我不认为这是自动更正的方法,但这里是您提出的问题的通用解决方案.它使用递归,它是在JavaScript(我不知道PHP).
function solve(word,sameLetters,customIndices = []){
    var splitLetters = word.split('')
                .map((char,index) => { // check if the current letter is within any variation
                    if(customIndices.length == 0 || customIndices.includes(index)){
                        var variations = sameLetters.find(arr => arr.includes(char));
                        if(variations != undefined) return variations;
                    }
                    return [char];
                 });

    // up to this point splitLetters will be like this
    //  [["?","?","?","?"],["?","?","?"],["?"],["?"],["?"],["?"]]
    var res = [];
    recurse(splitLetters,'',res); // this function will generate all the permuations
    return res;
}

function recurse(letters,index,cur,res){
    if(index == letters.length){
        res.push(cur);
    } else {
        for(var letter of letters[index]) {
            recurse(letters,index + 1,cur + letter,res );
        }
    }
}

var sameLetters = [     // represents the variations that you want to enumerate
    ['?','?'],['?','?','?']
];

var word = '??????';    
var customIndices = [0,1]; // will make variations to the letters in these indices only. leave it empty for all indices

var ans = solve(word,customIndices);
console.log(ans);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读