分治法求解-最长公共前缀
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); } }
相关文章推荐
- 分治法和动态规划求解最长公共子串
- python 实现求解字符串集的最长公共前缀方法
- LeetCode14. Longest Common Prefix(字典树:最长公共前缀)
- LeetCode -- 求字符串数组中的最长公共前缀
- 寻找一个字符串数组的最长公共前缀
- 动态规划方法求解最长公共子串
- java求解最长公共字串
- Java动态规划求解最长公共子串问题
- LeetCode 14. Longest Common Prefix(最长公共前缀)
- 【简单算法】20.最长公共前缀
- lintcode 最长公共前缀
- LeetCode第14题:最长公共前缀
- BNUOJ34990--Justice String (exkmp求最长公共前缀)
- Leetcode-最长公共前缀
- 最长公共前缀
- 最长公共前缀
- leetcode-14. Longest Common Prefix(寻找字符串数组最长公共前缀)
- LintCode 78.最长公共前缀
- 14.最长公共前缀
- LeetCode( Longest Common Prefix)最长公共前缀(需要回顾!)