关于衍生词替换成词根的面试题

英语词汇中,有一个“词根”的概念,就是可以从词根后面加一些其他词语来组成一个新的长一点的词,叫做“衍生词”。例如,“an” 词根后跟“other”,就可以组成一个新词“another”。


现在,给出一个包含许多词根的字典,和一个句子。你需要将句子中所有的衍生词替换为它对应的词根。如果一个衍生词有对应多个词根,使用最短的词根来进行替换。


示例:
  输入:
    dict = ["cat", "bat", "rat"]
    sentence = "the cattle was rattled by the battery"
  输出:
    "the cat was rat by the bat"


注意:


  1. 所有输入均为小写
  2. 1 <= 词根字典长度 <= 1000
  3. 1 <= 句子词数 <= 1000
  4. 1 <= 词根长度 <= 100
  5. 1 <= 句子中每个词长度 <= 1000


请填充如下代码的 “// TODO” 部分


<?php


function replace_root($dict, $sentence) {
      // TODO
}


?>


代码:

[php]  view plain  copy
  1. <?php  
  2.     //词根字典  
  3.     $dict = ['cat','bat','ca','rat'];//为了满足题目使用最短的词根来替换的要求,特地多了个ca  
  4.     //此处运用冒泡排序的主要目的是为了解决当一个衍生词有多个词根时,用后面的短词根替换前面的短词根,就满足了题目使用最短的词根来替换的要求了。  
  5.     $dict = maopao($dict);//冒泡降序处理  
  6.     //代替换处理的句子,注意句中的衍生词cattle就有2个词根了,cat和ca,我们应取最短的ca  
  7.     $sentence = ' hello, the  cattle was rattled by the battery ';  
  8.     //调用替换词根函数,输出句子  
  9.     echo '替换前:'.$sentence;  
  10.     echo '<br>';  
  11.     echo '替换后:'.replace_root($dict,$sentence);  
  12.   
  13.   
  14.     //替换词根  
  15.     function replace_root($dict,$sentence){  
  16.         //判断输入的参数格式是否正确  
  17.         if(!is_array($dict) || !is_string($sentence))  return '参数格式不对!';  
  18.         //判断词根字典长度是否符合要求  
  19.         if(count($dict) < 1 || count($dict) > 1000) return '词根字典长度不符合要求!';  
  20.         //去掉字符串左右两边的空格  
  21.         $trim_sentence = trim($sentence);  
  22.         //去掉没两个单词之间多余的空格,只空一格  
  23.         $greg_sentence = preg_replace("/\s+/"' '$trim_sentence);  
  24.         //把字符串转换成数组  
  25.         $sentence_array = explode(' ',$greg_sentence);  
  26.         //判断句子词数是否符合要求  
  27.         $sentence_length = $sentence_array;  
  28.         if(count($sentence_length) < 1 || count($sentence_length) > 1000) return '句子词数不符合要求!';  
  29.         foreach ($dict as $key => $val) {  
  30.             //判断字典的词根长度是否符合要求  
  31.             $root_length = strlen(trim($val));  
  32.             if($root_length < 1 || $root_length > 100) return '词根长度不符合要求!';  
  33.             foreach ($sentence_array as $k => &$v) {  
  34.                 //判断句子中单词的长度是否符合要求  
  35.                 $word_length = strlen($v);  
  36.                 if($word_length > 1000) return '句子中单词的长度不符合要求!';  
  37.                 if(strpos($v$val) === 0) $v = $val;//如果恒等于0,即居于句首,说明是该衍生词具有该词根  
  38.             }  
  39.         }  
  40.         //把数组转换成字符串  
  41.         $replace_sentence = implode(' '$sentence_array);  
  42.         return $replace_sentence;  
  43.     }  
  44.   
  45.   
  46.     //根据元素长度进行降序的冒泡排序算法  
  47.     function maopao($dict){  
  48.         if(!is_array($dict) || count($dict) < 1) return '参数不对!';  
  49.         for($i=0;$i<count($dict)-1;$i++ ){         
  50.             for($j=0;$j<count($dict)-1-$i;$j++){   
  51.                 if(strlen($dict[$j]) < strlen($dict[$j+1])){  
  52.                     $tmp = $dict[$j];  
  53.                     $dict[$j] = $dict[$j+1];  
  54.                     $dict[$j+1] = $tmp;  
  55.                 }   
  56.             }  
  57.         }  
  58.         return $dict;  
  59.     }  


运行截图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值