每周一道算法题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:最长公共子串的主要内容,如果未能解决你的问题,请参考以下文章

一天一道算法题---最长公共子序列

算法-最长回文子串(Manacher算法)

腾讯2016春招之算法编程解析

算法题407:动态规划和滑动窗口解决最长重复子数组

python经典算法题:无重复字符的最长子串

数据结构与算法 Manacher 算法求最长回文子串