每周一道算法题011:最长公共子串-程序员宅基地

技术标签: golang  php  

问题:

求以下几组单词的最长公共子串的长度
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
                }else{
                    cell[i][j] = 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
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baoli1912/article/details/100949632

智能推荐

(新版)SJTU-OJ-1003. 在麦当劳配数据-程序员宅基地

文章浏览阅读431次,点赞4次,收藏2次。题目描述注意:本题可以使用的头文件仅限于cstdioiostreamcstring梦回高三,小艾想起了几个月前背诵高考古诗文篇目的时光……已经是晚上了。第二天有小测,可是小艾还有篇古诗文没有背。这篇古诗文都有一个对应的瞌睡值,也就是说,选择背诵篇目会让小艾的瞌睡程度增加​。小艾目前的瞌睡程度已经是,而当小艾的瞌睡程度时,小艾会直接睡到明早,那可就没有更多的时间背了!注意,因为背了一半的文章也是没背出来的文章,所以恰好让小艾瞌睡程度的那篇也视作没背的。好在小测考到每个篇目的概率是一..._在麦当劳配数据

ubuntu16安装colmap的问题及解决方案_cudasetupargument 未定义的引用-程序员宅基地

文章浏览阅读2.3k次,点赞14次,收藏28次。最近想入门一下三维重建,看了一些三维重建的论文,还是想从SFM入手。先了解一下SFM里面经典的colmap(论文:[Structure-from-Motion Revisited](https://demuc.de/papers/schoenberger2016sfm.pdf)),看论文难以深入理解,所以打算看看源码,也是为了完成一个小小礼物。_cudasetupargument 未定义的引用

windows使用libvlc进行网络串流遇到的一些问题及解决方法_libvlc网络-程序员宅基地

文章浏览阅读857次。windows使用libvlc进行网络串流遇到的一些问题及解决方法_libvlc网络

ffmpeg--libswscale(图像缩放、颜色空间和像素格式转换操作)-程序员宅基地

文章浏览阅读1k次。主要函数:(1) sws_getContext():使用参数初始化SwsContext结构体。 可以用另一个接口函数sws_getCachedContext()取代。(2) sws_scale():转换一帧图像。(3) sws_freeContext():释放SwsContext结构体。初始化方式2种:①sws_getContext②sws_al..._libswscale

Python#Flask#Mysql水质监测预警系统10148-计算机毕业设计(附源码)_水位在线监测预警系统开发-程序员宅基地

文章浏览阅读178次,点赞3次,收藏2次。本系统前端部分基于MVVM模式进行开发,采用B/S模式,后端部分基于python的Flask框架进行开发。前端部分:前端框架采用了比较流行的渐进式JavaScript框架Vue.js。使用Vue-Router和Vuex实现动态路由和全局状态管理,Ajax实现前后端通信,Element UI组件库使页面快速成型,项目前端通过栅格布局实现响应式,可适应PC端、平板端、手机端等不同屏幕大小尺寸的完美布局展示。后端部分:基于python语言以Flask作为开发框架,同时集成Redis,Echarts等相关技。_水位在线监测预警系统开发

wxpython,窗口,控件,事件_wxpython 调用窗口控件-程序员宅基地

文章浏览阅读2.3k次。介绍一个python的图形化界面,wxpython。 wxpython是Python语言对流行的wxWidgets跨平台GUI工具库的绑定。而wxWidgets是用C++语言写成的。 wxPython是跨平台的。这意味着同一个程序可以不经修改地在多种平台上运行。现今支持的平台有:32/64位微软Windows操作系统、大多数Unix或类Unix系统、苹果Mac OS_wxpython 调用窗口控件

随便推点

Docker快速搭建Jaeger开发环境(Docker 部署Jaeger all-in-one)_docker 部署jaeger 部署-程序员宅基地

文章浏览阅读6.4k次。通过Docker 快速搭建Jaeger 本地测试、开发联调环境。_docker 部署jaeger 部署

Kotlin中的@Metadata-程序员宅基地

文章浏览阅读8.3k次,点赞2次,收藏7次。本文简单介绍了下注解Metadata各个字段的含义及其与反射的关系。Kotlin 允许我们对各种 Kotlin 的语法特性进行访问,不过,这里应该有一个问题没有搞清楚:既然 Java 反射对于 Kotlin 的很多特性都无法访问和识别,换句话说,Java 虚拟机也是无法知道他们的,那么 Kotlin 的反射是如何做到这一点的呢?这实际上主要是得益于kotlin.Metadata这个..._@metadata

深入理解Android音视频同步机制(五)如何从零开始写一个音视频同步的播放器_getplaybackheadposition-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏31次。前面我们分析了三个播放器的av sync逻辑,可以看到他们都各有不同,那么究竟哪种方法可以达到最好的avsync结果?哪些逻辑是必要的?如果我们想自己从零开始写一个av同步的播放器,都需要做哪些工作?本文通过一个demo解答上面的问题_getplaybackheadposition

linux 磁盘盘符改变,硬盘盘符重启后 自动切换——根据UUID挂载磁盘-程序员宅基地

文章浏览阅读997次。[root@platform-103 ~]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTvda 252:0 0 60G 0 disk├─vda1 252:1 0 500M 0 part /boo..._linux重启后盘符交换

数据结构与算法详解——散列表篇(附c++实现代码)_设计算法,将数组a 进行散列存储,以解决-程序员宅基地

文章浏览阅读1.8k次,点赞3次,收藏15次。目录散列表散列函数哈希冲突开放地址法线性探测二次探测双重散列链表法装载因子散列表  前面数组、链表、栈、队列都是序列式容器,存储的都是一个元素。而散列表又叫哈希表(hash table),是一种关联式容器,存储的是一对值,一般是一个key对应一个value(又叫键值对)。  c++ stl中的map就是一个散列表,举个例子:std::map<std::string,int> m;m["小明"]=170;std::cout<<"小明的身高是"<<m["小明"]&_设计算法,将数组a 进行散列存储,以解决

域名讲解(一)域名基础概念-程序员宅基地

文章浏览阅读8k次,点赞4次,收藏26次。它作为可以将域名和IP地址相互映射的一个分布式数据库,是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的系统,搭载域名系统的机器称之为域名服务器,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP地址数串。,并通过网域名称系统(DNS,Domain Name System)来将域名和IP地址相互映射,使人更方便地访问互联网,而不用去记住能够被机器直接读取的IP地址数串。对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。..._域名

推荐文章

热门文章

相关标签