如何循环显示单词列表中的特定字母?

How to display specific letters from a list of words in a loop?

我在面试中收到了这个挑战,我想得到一些帮助来解决它。

使用输入字符串:PHP CODING TECH,生成以下输出。

PCT
PHCT
PHPCT
PHPCOT
PHPCODT
PHPCODIT
PHPCODINT
PHPCODINGT
PHPCODINGTE
PHPCODINGTEC
PHPCODINGTECH

据我了解,逻辑是将输入字符串分解为空格,然后在循环结构中,将每个单词的前导字母显示为单个字符串。在每次迭代期间(在第一次之后),最早的不完整单词显示一个额外的前导字母。

这是我的编码尝试:

$str = "PHP CODING TECH";
$a = explode(' ', $str);
for ($i=0; $i < count($a); $i++) {
    for ($j=0; $j < strlen($a[$i]) ; $j++) { 
        //echo "<pre>";
        $b[$i][$j] = explode(' ', $a[$i][$j]);
    }
}
echo "<pre>";
print_r($b);

代码:(Demo) (or with DO-WHILE())

$input = "PHP CODING TECH";
$counters = array_fill_keys(explode(' ', $input), 1); // ['PHP' => 1, 'CODING' => 1, 'TECH' => 1]

$bump = false;                                        // permit outer loop to run
while (!$bump) {                                      // while still letters to output....
    $bump = true;                                     // stop after this iteration unless more letters to output
    foreach ($counters as $word => &$len) {           // $len is mod-by-ref for incrementing
        echo substr($word, 0, $len);                  // echo letters using $len
        if ($bump && isset($word[$len])) {            // if no $len has been incremented during inner loop...
            ++$len;                                   // increment this word's $len
            $bump = false;                            // permit outer loop to run again
        }
    }
    echo "\n";                                        // separate outputs
}

输出:

PCT
PHCT
PHPCT
PHPCOT
PHPCODT
PHPCODIT
PHPCODINT
PHPCODINGT
PHPCODINGTE
PHPCODINGTEC
PHPCODINGTECH

解释:

我正在从展开的输入字符串中生成一个单词数组和初始长度。 $bump 是 dual-purpose;它不仅控制外循环,还指示在内循环中增加长度的单词。 $len 是 "modifiable by reference",因此任何给定单词的 $len 值都可以递增并存储以供下一次迭代使用。 isset()用于$word[$len]判断当前单词是否有更多可用字母在下一次迭代中输出;如果没有,下一个单词有机会(直到所有单词都完全显示)。


在等待重新打开此页面时,我想出了一个替代方法:

$input = "PHP CODING TECH";
$words = explode(' ', $input);                // generates: ['PHP', 'CODING', 'TECH']
$master = '';                                 // initialize for first offset and then concatenation
foreach ($words as $word) {
    $offsets[] = strlen($master);             // after loop, $offsets = [0, 3, 9]
    $master .= $word;                         // after loop, $master = 'PHPCODINGTECH'
}
$master_offsets = range(0, strlen($master));  // generates: [0,1,2,3,4,5,6,7,8,9,10,11,12]

do {
    foreach ($offsets as $offset) {
        echo $master[$offset];
    }
    echo "\n";
} while ($master_offsets !== ($offsets = array_intersect($master_offsets, array_merge($offsets, [current(array_diff($master_offsets, $offsets))]))));  // add first different offset from $master_offsets to $offsets until they are identical