问题
This is not homework: Came across this scenario while working on PHP String Differences and Dynamic Restrictions
Given a string of n words how to distribute them into m groups without altering the word sequence?
Example 1:
String: "My name is SparKot"
Groups: 2 (string is split in to two strings)
Possible groups will be:
('My', 'name is SparKot'),
('My name', 'is SparKot'),
('My name is', 'SparKot')
with the same string
Example 2:
String: "My name is SparKot"
Groups: 3 (string will be split in to three strings)
Possible groups will be:
('My', 'name', 'is SparKot'),
('My', 'name is', 'SparKot'),
('My name', 'is', 'SparKot')
My PHP function() with no direction(it is suppose to return Multi-dimension of groups):
function get_possible_groups ($orgWords, $groupCount, &$status) {
$words = explode (' ', $orgWords);
$wordCount = count($words);
if ($wordCount < $groupCount) {
$status = -1;
return;
} else if ($wordCount === $groupCount) {
$status = 0;
return (array_chunk($words, 1));
}
for ($idx =0; $idx < $wordCount; $idx) {
for ($jdx =0; $jdx < $groupCount; $jdx++) {
}
}
// append all arrays to form multidimension array
// return groupings[][] array
}
$status =0;
$groupings = get_possible_groups('My name is SparKot', 4, $status);
var_dump($groupings);
for above example-2 function is supposed to return:
$groupings = array (
array ('My', 'name', 'is SparKot'),
array ('My', 'name is', 'SparKot'),
array ('My name', 'is', 'SparKot'));
Any hints to approach this problem will be much appreciated.
Progress:
- case: when
wordCount = groupCount[solved]
回答1:
Ok, so, it took me quite a while but I think I managed to get this right. I'm really proud, to be honest, since I don't usually do well with algorithms. Anyway, here we go:
function getPossibleGroups($string, $groups) {
$words = explode(' ', $string);
$wordCount = count($words);
if ($groups === 1) {
return array(array($string));
} elseif ($groups > $wordCount) {
return null;
} elseif ($groups === $wordCount) {
return array($words);
}
$results = array();
// We get every possible result for the first group
for ($i = 1; $i <= $wordCount - $groups + 1; $i++) {
$firstGroup = implode(' ', array_slice($words, 0, $i));
// Recursively get all posible results for the other groups
$otherGroups = getPossibleGroups(implode(' ', array_slice($words, $i)), $groups - 1);
// Merge both things
$allGroups = array_map(function($v) use ($firstGroup) {
return array_merge(array($firstGroup), $v);
}, $otherGroups);
// Add that to the results variable
$results = array_merge($results, $allGroups);
}
return $results;
}
来源:https://stackoverflow.com/questions/15144811/possible-grouping-of-words