每周一道算法题011:最长公共子串
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每周一道算法题011:最长公共子串相关的知识,希望对你有一定的参考价值。
问题:求以下几组单词的最长公共子串的长度
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
以上是关于每周一道算法题011:最长公共子串的主要内容,如果未能解决你的问题,请参考以下文章