Created
August 17, 2018 08:42
-
-
Save showsky/bd3864ada39f12801ec161bd7703b05f to your computer and use it in GitHub Desktop.
LCS
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| class LCS { | |
| private $str1; | |
| private $str2; | |
| private $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); | |
| } | |
| /*返回两个串的相似度*/ | |
| public function getSimilar($str1, $str2) { | |
| $len1 = strlen($str1); | |
| $len2 = strlen($str2); | |
| $len = strlen($this->getLCS($str1, $str2, $len1, $len2)); | |
| return $len * 2 / ($len1 + $len2); | |
| } | |
| public 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]; | |
| } | |
| } | |
| } | |
| } | |
| public 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); | |
| } | |
| } | |
| } | |
| $lcs = new LCS(); | |
| //返回相似度 | |
| echo $lcs->getSimilar("我要看電視","你要不要看電視"); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment