您的位置:首页 > 其它

分治法求解-最长公共前缀

2019-02-27 10:03 239 查看

注意审题:只是求解最长公共前缀,而不是字符串数组中的最长公共字符串

1、分治法的定义:

当求解的问题较复杂,不能立刻得到原问题的解,不过这一类问题可以分解为

若干个与原问题性质相类似
的子问题,而子问题可以方便得到它们的解,最后通过
合并子问题的解
得到原问题的解。

2、分治法适用的条件

(1)、原问题可以分解为若干个与原问题性质相类似的子问题;
(2)、问题的规模缩小到一定程度后可方便求解;
(3)、子问题的解可以合并到原问题的解;
(4)、分解出的各个子问题相互独立,即不包含重叠子问题。

3、分治法的求解步骤

(1)、分解问题(divide):把具有n个元素的数组分解为两个n/2大小的数组;
(2)、求解子问题(conquer):递归求解子数组,直到子数组只包含一个元素为止;
(3)、合并子问题的解(combine):两两合并已排好序的子数组使之成为一个新的排好序的子数组,重复这样两两合并的过程直到得到原问题的解。

4、最长公共前缀问题

编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。

5、示例代码

class Solution {

/**
* @param String[] $strs
* @return String
*/
function longestCommonPrefix($strs) {
//过滤输入
if(empty($strs))
{
return '';
}
return $this->CommonPrefix($strs,0,count($strs)-1);
}

//递归的函数
function CommonPrefix($strs,$left=0,$right=0)
{
if($left == $right)
{
return $strs[$left];
}
else
{
$mid        = intval(($left + $right) / 2);//每次递归不同的条件
$lcp_left   = $this->CommonPrefix($strs,$left,$mid);//递归函数
$lcp_right  = $this->CommonPrefix($strs,$mid+1,$right);//递归函数
return $this->Compare($lcp_left,$lcp_right);//子问题求解函数
}
}
//子问题求解函数,已经细分到很简单的两个数的比较
function Compare($left,$right)
{
//注意审题,求解的是最长的前缀,而不是最长的字符串
$min = min(strlen($left),strlen($right));
for($i=0;$i<$min;$i++)
{
if($left[$i] !=  $right[$i])
{
return  substr($left,0,$i);
}
}
return substr($left,0,$min);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: