php 字符串匹配相似度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | <?php class LCS { var $str1 ; var $str2 ; var $c = array (); /*返回串一和串二的最长公共子序列 */ function getLCS( $str1 , $str2 , $len1 = 0, $len2 = 0) { $this ->str1 = $str1 ; $this ->str2 = $str2 ; if ( $len1 == 0) $len1 = strlen ( $str1 ); if ( $len2 == 0) $len2 = strlen ( $str2 ); $this ->initC( $len1 , $len2 ); return $this ->printLCS( $this ->c, $len1 - 1, $len2 - 1); } /*返回两个串的相似度 */ function getSimilar( $str1 , $str2 ) { $len1 = strlen ( $str1 ); $len2 = strlen ( $str2 ); $len = strlen ( $this ->getLCS( $str1 , $str2 , $len1 , $len2 )); return $len * 2 / ( $len1 + $len2 ); } function initC( $len1 , $len2 ) { for ( $i = 0; $i < $len1 ; $i ++) $this ->c[ $i ][0] = 0; for ( $j = 0; $j < $len2 ; $j ++) $this ->c[0][ $j ] = 0; for ( $i = 1; $i < $len1 ; $i ++) { for ( $j = 1; $j < $len2 ; $j ++) { if ( $this ->str1[ $i ] == $this ->str2[ $j ]) { $this ->c[ $i ][ $j ] = $this ->c[ $i - 1][ $j - 1] + 1; } else if ( $this ->c[ $i - 1][ $j ] >= $this ->c[ $i ][ $j - 1]) { $this ->c[ $i ][ $j ] = $this ->c[ $i - 1][ $j ]; } else { $this ->c[ $i ][ $j ] = $this ->c[ $i ][ $j - 1]; } } } } function printLCS( $c , $i , $j ) { if ( $i == 0 || $j == 0) { if ( $this ->str1[ $i ] == $this ->str2[ $j ]) return $this ->str2[ $j ]; else return "" ; } if ( $this ->str1[ $i ] == $this ->str2[ $j ]) { return $this ->printLCS( $this ->c, $i - 1, $j - 1) . $this ->str2[ $j ]; } else if ( $this ->c[ $i - 1][ $j ] >= $this ->c[ $i ][ $j - 1]) { return $this ->printLCS( $this ->c, $i - 1, $j ); } else { return $this ->printLCS( $this ->c, $i , $j - 1); } } } /** * 字符串排序 * @description 将答案 ADCB 转换成 ABCD * @param string $string * @param string $sort asc|desc * @return string */ function answerSort( $string = '' , $sort = 'asc' ){ if ( empty ( $string )){ return '' ; } //拆分成数组,然后排序 $arr = mb_str_split( $string ); if ( $sort == 'asc' ){ sort( $arr ); //值升序 } else { rsort( $arr ); //值降序 } //返回新字符串 $string = implode( '' , $arr ); return $string ; } /** * 将字符串分割为数组 * @param string $str 字符串[支持中文字符串] * @return array 分割得到的数组 */ function mb_str_split( $str ) { return preg_split( '/(?<!^)(?!$)/u' , $str ); } $c = answerSort( "几天奶奶3天气sa1" ); $b = answerSort( "气几天13sa" ); $lcs = new LCS(); //返回最长公共子序列 echo $lcs ->getLCS( $c , $b ); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)