给定一个包含n个值的数组,例如:
$arr[] = 'ABCDEFABC';
$arr[] = 'ABCDEFDEF';
$arr[] = 'ABCDEFGHI';
$arr[] = 'ABCDEFJKL';
如何找到与所有(或大多数,在示例中为下)值相匹配的初始段,在本例中为ABCDEF?
编辑2:不已解决,请回答。
更糟糕的是,给定以下数组:
$arr[] = 'ABCDEFABC';
$arr[] = 'ABCDEFDEF';
$arr[] = 'ABCDEFGHI';
$arr[] = 'ABCDEFJKL';
$arr[] = 'DEFABCABC';
$arr[] = 'DEFABCDEF';
$arr[] = 'DEFABCGHI';
$arr[] = 'DEFABCJKL';
我怎样才能得到:
$result[] = 'ABCDEF';
$result[] = 'DEFABC';
这个很棘手......我想要完成的是strspn()的行为(其中“掩码”的顺序很重要,谢谢Zed)应用于数组。
编辑:为了澄清一点我想要的是在数组的所有值中找到同一索引中存在的所有常用字母(不确定这是否更容易!) 。在第二个问题中,由于所有字符与其他值中的索引不匹配,我需要匹配相同初始段的最大数量(在本例中为2:ABCDEF和DEFABC)。
答案 0 :(得分:2)
如果我理解正确,你会尝试在给定一组字符串的情况下确定最长公共前缀的集合。
将其分解,任何两个字符串之间的共享前缀可以找到
function longestCommonPrefix($str1, $str2) {
$minLen = min(strlen($str1), strlen($str2));
for ($i = 0; $i < $minLen; $i++) {
if ($str1[$i] != $str2[$i]) {
return substr($str1, 0, $i);
}
}
return substr($str1, 0, $minLen);
}
获取前缀集的一种方法可能是:
function longestCommonPrefixes($arr) {
sort($arr);
$prefixes = array();
for ($i = 0; $i < count($arr); $i++) {
for ($j = $i+1; $j < count($arr); $j++) {
$prefix = longestCommonPrefix($arr[$i], $arr[$j]);
if ($prefix == "") break;
$prefixes[$prefix] = true;
}
}
return array_keys($prefixes);
}
请注意,返回的前缀可能是彼此的前缀。也就是说,结果可能包含一组字符串,例如array('A', 'AA', 'AAA')
。
全部放在一起:
$arr = array();
$arr[] = 'ABCDEFABC';
$arr[] = 'ABCDEFDEF';
$arr[] = 'ABCDEFGHI';
$arr[] = 'ABCDEFJKL';
$arr[] = 'DEFABCABC';
$arr[] = 'DEFABCDEF';
$arr[] = 'DEFABCGHI';
$arr[] = 'DEFABCJKL';
print_r(longestCommonPrefixes($arr));
产量
Array
(
[0] => ABCDEF
[1] => DEFABC
)
答案 1 :(得分:0)
我想出了第一个问题的解决方案:
编辑:BUGGY!
$arr = array();
// Bug: ABCDEFX
$arr[] = 'ABCDEFAXC';
$arr[] = 'ABCDEFDXF';
$arr[] = 'ABCDEFGXI';
$arr[] = 'ABCDEFJXL';
/*
$arr[] = 'ABCDEFABC';
$arr[] = 'ABCDEFDEF';
$arr[] = 'ABCDEFGHI';
$arr[] = 'ABCDEFJKL';
*/
// ABCDEF
$result = implode('', call_user_func_array('array_intersect_assoc', array_map('str_split', $arr)));
现在还剩一个......