加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

每周一道算法题011:最长公共子串

发布时间:2020-12-13 21:31:07 所属栏目:PHP教程 来源:网络整理
导读:问题: 求以下几组单词的最长公共子串的长度 1.fish和fosh 2.fish和hish 3.fish和vista 思路: 可以用表格法,横纵坐标分别是两个单词,如果字符相同,就用左上角的数字加1,最后取表格中的最大值。 解答: php: ?php// 找出两个单词的最长公共子串function
问题:

求以下几组单词的最长公共子串的长度
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,$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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读