如何检查是否可以从字母列表中创建单词?

use*_*072 6 php arrays string loops words

我有一个字符串$raw="aabbcdfghmnejaachto"和一个数组$word_array=array('cat','rat','goat','total','egg').

我的程序需要检查是否可以使用字符串中的字母来生成数组中的单词.有一个额外的条件; 如果单词包含多于一次的字母,则该字母必须至少在字符串中出现相同的次数.

例如egg.有两个g.如果字符串$raw不包含两个字符串g,那么就不可能生成这个单词.

这是我的预期结果:

Array([cat]=>'Yes',[rat]=>'No',[goat]=>'Yes',[total]=>'No',[egg]=>'No')
Run Code Online (Sandbox Code Playgroud)

我尝试了以下,但它没有输出预期的结果:

$res=array();
$raw="aabbcdfghmnejaachto";
$word_array=array('cat','rat','goat','total','egg');
$raw_array= str_split($raw);
foreach($word_array as $word=>$value)
{
    $word_value= str_split($value);
    foreach($word_value as $w=>$w_value)
    {
        foreach($raw_array as $raw=>$raw_value)
        {
            if(strcmp($w_value,$raw_value)==0)
            {
                $res[$value]='Yes';
            }
            else
            {
                $res[$value]='No';
            }
        }
    }
}
print_r($res);
Run Code Online (Sandbox Code Playgroud)

编辑:最初发布的代码缺少e字符串中的字母,$raw因此egg示例实际上将返回No.我已更新问题和所有答案以反映这一点.- robinCTS

yoe*_*nes 9

  • 您必须循环遍历$words数组中的每个单词/元素,然后再循环遍历每个单词的每个字符.
  • 在外循环的每次迭代时,将默认结果值设置为Yes.
  • 然后,您必须迭代当前单词的每个唯一字符.(array_count_values())
  • 检查单词中当前字符的出现次数是否大于字母串中当前字符的出现次数.

*作为性能优化的问题,array_count_values()在内循环上使用,以避免重复字母的任何不必要的迭代$word.该$count变量节省了必须substr_count()在if语句中进行两次调用.

代码:( 演示)

$string = "aabbcdfghmnejaachto";
$words = array('cat','rat','goat','total','egg');
foreach ($words as $word) {  // iterate each word
    $result[$word]='Yes';  // set default result value
    foreach (array_count_values(str_split($word)) as $char=>$count) {  // iterate each unique letter in word
        if ($count > substr_count($string, $char)) {  // compare current char's count vs same char's count in $string
            $result[$word]='No';  // if more of the character in word than available in $string, set No
            break;  // make early exit from inner loop, to avoid unnecessary iterations
        }
    }    
}
var_export($result);
Run Code Online (Sandbox Code Playgroud)

这是输出:

array (
  'cat' => 'Yes',
  'rat' => 'No',
  'goat' => 'Yes',
  'total' => 'No',
  'egg' => 'No',
)
Run Code Online (Sandbox Code Playgroud)

BIG THANKYOUmickmackusa劫持显著提高这个答案.