问题:
求以下几组单词的最长公共子串的长度
1.fish和fosh
2.fish和hish
3.fish和vista
思路:
可以用表格法,横纵坐标分别是两个单词,如果字符相同,就用左上角的数字加1,最后取表格中的最大值。
解答:
php:
<?php
// 找出两个单词的最长公共子串
function findLongestSubString($word1, $word2)
{
$len1 = strlen($word1);
$len2 = strlen($word2);
$cell = array();
for ($i = 0; $i < $len1; $i++) {
for ($j = 0; $j < $len2; $j++) {
// 如果两个字符相同,则取其左上角的数值+1
if ($word1[$i] == $word2[$j]) {
if ($i > 0 && $j > 0) {
$cell[$i][$j] = $cell[$i - 1][$j - 1] + 1;
} else {
$cell[$i][$j] = 1;
}
} else {
$cell[$i][$j] = 0;
}
}
}
printCell($word1, $word2, $cell);
$maxLength = findMaxValue($cell);
echo $maxLength . "\n";
}
// 找出值最大的单元格
function findMaxValue($cell)
{
$max = 0;
foreach ($cell as $rows) {
foreach ($rows as $item) {
if ($item > $max) {
$max = $item;
}
}
}
return $max;
}
function printCell($word1, $word2, $cell)
{
$len1 = strlen($word1);
$len2 = strlen($word2);
echo " ";
for ($i = 0; $i < $len2; $i++) {
echo $word2[$i] . " ";
}
echo "\n";
for ($i = 0; $i < $len1; $i++) {
echo $word1[$i] . " ";
echo implode(' ', $cell[$i]) . "\n";
}
}
findLongestSubString("fish", "fosh");
findLongestSubString("fish", "hish");
findLongestSubString("hish", "vista");
输出:
f o s h
f 1 0 0 0
i 0 0 0 0
s 0 0 1 0
h 0 0 0 2
2
h i s h
f 0 0 0 0
i 0 1 0 0
s 0 0 2 0
h 1 0 0 3
3
v i s t a
h 0 0 0 0 0
i 0 1 0 0 0
s 0 0 2 0 0
h 0 0 0 0 0
2
golang:
package main
import "fmt"
func main() {
findLongestSubString("fish", "fosh")
findLongestSubString("fish", "hish")
findLongestSubString("fish", "vista")
}
func findLongestSubString(word1, word2 string) {
len1 := len(word1)
len2 := len(word2)
cell := make([][]int, len1)
for i := 0; i < len1; i++ {
cell[i] = make([]int, len2)
for j := 0; j < len2; j++ {
if word1[i] == word2[j] {
if i > 0 && j > 0 {
cell[i][j] = cell[i-1][j-1] + 1
}
}
}
}
val := findMaxValue(cell)
fmt.Println(val)
}
func findMaxValue(cell [][]int) int {
max := 0
for _, rows := range cell {
for _, item := range rows {
if item > max {
max = item
}
}
}
return max
}
输出:
2
3
2