每周一道算法题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
上一篇:【swupdate文档 五】从可信的来源更新镜像


下一篇:牛客刷题Java实现----翻转单词顺序列