• 算法 -- 求最长公共字符串&PHP


    https://blog.csdn.net/hongyuancao/article/details/83308093

    本文是利用PHP,求最长公共字符串。
    思路:利用动态规划和矩阵的思想。

    动态规划:就是用空间的代价来争取时间,将中间结果保存下来,后面循环使用供,减少重复计算次数。

    矩阵思想:定义一个矩阵,宽和高分别为两个字符串的长度。从上到下、从左到右逐个扫描,每次扫描要比较矩阵中每个点对应的行列字符是否相等, 相等的话等于左上邻+1,不相等则置为0。

    时间复杂度:矩阵中的长和宽的乘积即为复杂度。复杂度为O(mn)。

    如两个字符串:“abcd”和“ebc”。如下图所示:

    注:为什么相等的话要等于左上邻+1?因为左上邻代表两个字符串的各自前一个元素,如果前一个元素是对应相等的,且当前位置的对应元素也相等,那么公共字符串的长度需要+1,因此等于左上邻+1。

    求最长公共字符串的代码如下:

    function getLongestSameStr($a, $b)
    {
        if (empty($a) || empty($b)) return 0;
        // 判断字符串是否包含
        if (strlen($a) > strlen($b)) {
            if (strstr($a, $b) != '') return $b;
        } else {
            if (strstr($b, $a) != '') return $a;
        }
     
        $same_arr = [];// 矩阵
        $same_str = [];// 所有相同的字符串
        $a_len = strlen($a);
        $b_len = strlen($b);
        $longest_str = 0;// 最长的字符串
        for ($i = 0; $i < $a_len; $i++) {
            for ($j = 0; $j < $b_len; $j++) {
                if ($a[$i] == $b[$j]) {
                    if ($i > 0 && $j > 0) {
                        $same_arr[$i][$j] = $same_arr[$i - 1][$j - 1] + 1;
                    } else {
                        $same_arr[$i][$j] = 1;
                    }
                    // 所有相同长度的字符串
                    $longest_str = max($longest_str, $same_arr[$i][$j]);
                    $same_str[] = substr($a, $i - $same_arr[$i][$j] + 1, $same_arr[$i][$j]);
                } else {
                    $same_arr[$i][$j] = 0;
                }
            }
        }
        // 最长的相同字符串
        $longest_same_str = [];
        foreach ($same_str as $v) {
            if ($longest_str == strlen($v)) {
                $longest_same_str[] = $v;
            }
        }
        return $longest_same_str;
    }

    实例如下,随便定义两个字符串,$a和$b,调用此函数。

    $a = '11111111abced3212334123wqeqwe156123456789';
    $b = '111222abced3213346262qweqweqweqwe64123456789';
    $aaa = getLongestSameStr($a, $b);
    echo '<pre>';
    print_r($aaa);
    输出结果为:
    
    Array
    (
        [0] => 123456789
    )
    假如设定特殊的字符串,如$a和$b有两个公共的相同长度的字符串,调用次函数后会出现两个字符串。
    
    $a = '11111111abced321334123wqeqwa12345678901';
    $b = '111222abced3213346262qweqweqweqweb12345678901';
    $aaa = getLongestSameStr($a, $b);
    echo '<pre>';
    print_r($aaa);
    结果如下:
    
    Array
    (
        [0] => abced321334
        [1] => 12345678901
    )
    达到了预期的效果。
  • 相关阅读:
    Python函数知识汇总-课堂笔记
    集合set内部常用功能和使用方法-课堂笔记及课后总结
    win7_64位操作系统安装python3.6.3遇到的问题和解决方法
    字典dic内部常用功能和使用方法-课堂笔记及课后总结
    列表内部常用功能和使用方法-课堂笔记及课后总结
    Python Str内部功能-个人课堂笔记,课后总结
    深入理解Java虚拟机读书笔记9----线程完全与锁优化
    深入理解Java虚拟机读书笔记8----Java内存模型与线程
    深入理解Java虚拟机读书笔记7----晚期(运行期)优化
    深入理解Java虚拟机读书笔记6----早期(编译期)优化
  • 原文地址:https://www.cnblogs.com/rxbook/p/10338344.html
Copyright © 2020-2023  润新知