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 ;
// 判断字符串是否包含
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 = ;// 最长的字符串
for ($i = ; $i < $a_len; $i++) {
for ($j = ; $j < $b_len; $j++) {
if ($a[$i] == $b[$j]) {
if ($i > && $j > ) {
$same_arr[$i][$j] = $same_arr[$i - ][$j - ] + ;
} else {
$same_arr[$i][$j] = ;
}
// 所有相同长度的字符串
$longest_str = max($longest_str, $same_arr[$i][$j]);
$same_str[] = substr($a, $i - $same_arr[$i][$j] + , $same_arr[$i][$j]);
} else {
$same_arr[$i][$j] = ;
}
}
}
// 最长的相同字符串
$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
(
[] =>
)
假如设定特殊的字符串,如$a和$b有两个公共的相同长度的字符串,调用次函数后会出现两个字符串。 $a = '11111111abced321334123wqeqwa12345678901';
$b = '111222abced3213346262qweqweqweqweb12345678901';
$aaa = getLongestSameStr($a, $b);
echo '<pre>';
print_r($aaa);
结果如下: Array
(
[] => abced321334
[] =>
)
达到了预期的效果。

算法 -- 求最长公共字符串&PHP的更多相关文章

  1. POJ 3080 Blue Jeans (求最长公共字符串)

    POJ 3080 Blue Jeans (求最长公共字符串) Description The Genographic Project is a research partnership between ...

  2. Java算法——求出两个字符串的最长公共字符串

    问题:有两个字符串str1和str2,求出两个字符串中最长公共字符串. 例如:“acbbsdef”和"abbsced"的最长公共字符串是“bbs” 算法思路: 1.把两个字符串分别 ...

  3. Java实现 LeetCode 583 两个字符串的删除操作(求最长公共子序列问题)

    583. 两个字符串的删除操作 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符. 示例: 输入: " ...

  4. 文本比较算法Ⅱ——Needleman/Wunsch算法的C++实现【求最长公共子串(不需要连续)】

    算法见:http://www.cnblogs.com/grenet/archive/2010/06/03/1750454.html 求最长公共子串(不需要连续) #include <stdio. ...

  5. 求字符串A与字符串B的最长公共字符串(JAVA)

    思路:引入一个矩阵的思想,把字符串A(长度为m)当成矩阵的行,把字符串B(长度为n)当矩阵的列.这样就构成一个m*n的矩阵.若该矩阵的节点相应的字符同样,即m[i]=n[j]时.该节点值为1:当前字符 ...

  6. 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message

    Language: Default Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 21 ...

  7. [algorithm]求最长公共子序列问题

    最直白方法:时间复杂度是O(n3), 空间复杂度是常数 reference:http://blog.csdn.net/monkeyandy/article/details/7957263 /** ** ...

  8. 计蒜之道 初赛 第三场 题解 Manacher o(n)求最长公共回文串 线段树

    腾讯手机地图 腾讯手机地图的定位功能用到了用户手机的多种信号,这当中有的信号的作用范围近.有的信号作用的范围则远一些.有的信号相对于用户在不同的方位强度是不同的,有的则是在不论什么一个方向上信号强度都 ...

  9. poj 2774 Long Long Message,后缀数组,求最长公共子串 hdu1403

    题意:给出两个字符串,求最长公共子串的长度. 题解:首先将两个字符串连在一起,并在中间加一个特殊字符(字串中不存在的)切割,然后两个串的最长公共字串就变成了全部后缀的最长公共前缀.这时就要用到heig ...

随机推荐

  1. apache2.2服务无法启动 发生服务特定错误:1 的解决办法 (windows服务错误 日志查看方法)

    转 https://blog.csdn.net/liuensong/article/details/6738041 查错过程: 1.查看apache错误日志:目录下的apache/logs/error ...

  2. 十、K3 WISE 开发插件《SQL Profiler跟踪单据操作时产生的SQL语句》

    =================================== 目录: 1.查询帐套的数据库DBID 2.配置需要跟踪数据库的DBID 3.配置跟踪参数 4.跟踪进行 5.分析跟踪语句 === ...

  3. Asp.Net Identity cookie共享

    n the Startup.Auth.cs file, add the CookieDomain parameter with your domain: var cookieAuthenticatio ...

  4. textarea 固定大小,滚动条,限制拖动,文字对齐

    取值:$("#ID").val(); 控制大小:加width,height限制(style="width:100px;height:200px;");或row, ...

  5. 创建数据库,创建数据库表,例子。MySQL语句

    1.创建数据库:    创建的代码:create  数据库的代码:database   数据库表名:随便起,只要自己记住就行.test create database test; 2.删除数据库: 删 ...

  6. DB2的进程/线程解析(转)

    今天看到一个名词,数据库实例用户和实例隔离用户,那么什么是实例隔离用户呢,于是搜索以下,就涉及到了进程. 援引DB2中国上面的回答:   要理解DB2的fenced user, 需要先理解db2的fe ...

  7. WebLogic初学笔记

    这两天在公司自己摸索着用WebLogic(因为可以问的同事不多),之前一直用的是tomcat.面对一个从不了解的技术,自己摸索似乎非常背劲.后来有同事指点果然事半功倍. 项目使用WebLogic版本: ...

  8. python字符串魔法

    test = 'alEx' print(test.capitalize()) # 首字母大写 其他都变小写 print(test.casefold()) # 变小写 更牛逼 print(test.lo ...

  9. 【每日一题】 UVA - 1589 Xiangqi 函数+模拟 wa了两天

    题意:背景就是象棋, 题解:坑点1(wa的第一天):将军可以吃掉相邻的棋子,(然行列也写反了orz) 坑点2(wa的第二天):将军到马要反过来写,边界有误,并且第一次碰到的车才算(写到后来都忘了) # ...

  10. 【鬼畜】UVA - 401每日一题·猛男就是要暴力打表

    管他什么rev数组,msg数组简化代码 #define _CRT_SECURE_NO_WARNINGS #include <cmath> #include <iostream> ...