雅虎公司C#笔试题(后半部份才是)

“雅虎公司C#笔试题(后半部份才是)”是一道常见于程序员面试和笔试的题目。下面就从如何解题的角度,为大家讲解完整攻略。

题目描述

题目大意是给出两个字符串,求它们在其中一个字符串中的最长公共子串。

具体需要完成的是,实现一个方法 string Find(string str1, string str2, string source),其中:

  1. 参数 str1 和 str2 分别表示两个字符串,字符串长度小于 100。
  2. 参数 source 表示包括 str1 和 str2 的字符串,字符串长度小于 1000。
  3. 返回值为 str1 和 str2 在 source 中的最长公共子串,如果不存在,返回空字符串。

解题思路

本题要求的是两个字符串在另一个字符串中的最长公共子串,因此我们可以采用一种类似于动态规划的思路来解决。

首先定义一个二维数组 dp,其中 dp[i,j] 表示以 source[i-1]source[j-1] 结尾的两个子串的最长公共子串长度。这里用 i-1j-1 是为了避免数组越界问题。

然后我们重复执行以下步骤,直到所有的 dp 值都求出来:

  1. 如果 source[i-1] == source[j-1],那么 dp[i,j] 就等于 dp[i-1,j-1] + 1
  2. 否则,dp[i,j] 就等于 0。

我们再定义两个变量 maxLenendIndex,分别表示最长公共子串的长度和结束位置。我们在更新每个 dp[i,j] 的时候,如果它的值比 maxLen 还大,就更新 maxLenendIndex

最后,我们从 endIndex-maxLen 的位置开始,取出长度为 maxLen 的子串,就是我们要求的最长公共子串。

代码实现

下面是 C# 语言的完整代码实现。

public string Find(string str1, string str2, string source)
{
    if (string.IsNullOrEmpty(str1) || string.IsNullOrEmpty(str2) || string.IsNullOrEmpty(source))
    {
        return string.Empty;
    }

    int len1 = str1.Length;
    int len2 = str2.Length;
    int len = source.Length;
    int maxLen = 0;
    int endIndex = 0;

    int[,] dp = new int[len + 1, len + 1];

    for (int i = 1; i <= len; i++)
    {
        for (int j = 1; j <= len; j++)
        {
            if (source[i - 1] == str1[j - 1])
            {
                dp[i, j] = dp[i - 1, j - 1] + 1;
                if (dp[i, j] > maxLen)
                {
                    maxLen = dp[i, j];
                    endIndex = i;
                }
            }
        }
    }

    if (maxLen == 0)
    {
        return string.Empty;
    }

    return source.Substring(endIndex - maxLen, maxLen);
}

示例说明

为了更好地理解上述代码,我们来看两个示例。

示例一

假设给定的输入是:

str1: "hello"
str2: "world"
source: "helloworld"

执行 Find 方法后,我们得到的输出应该是 "world"

这是因为 "world" 是字符串 "hello""world" 在字符串 "helloworld" 中的最长公共子串。

示例二

假设给定的输入是:

str1: "abcd"
str2: "efgh"
source: "ijkl"

执行 Find 方法后,我们得到的输出应该是空字符串 ""

这是因为字符串 "abcd""efgh" 在字符串 "ijkl" 中不存在公共子串。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:雅虎公司C#笔试题(后半部份才是) - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 使用VS2019编译CEF2623项目的libcef_dll_wrapper.lib的方法

    下面是使用VS2019编译CEF2623项目的libcef_dll_wrapper.lib的方法的完整攻略。 准备工作 首先需要准备CEF2623的源代码和编译环境,确保以下步骤顺利进行。 下载CEF2623的源代码。可以到官网(https://bitbucket.org/chromiumembedded/cef/src/2623/)下载。 安装Visual…

    C 2023年5月23日
    00
  • Python中优雅处理JSON文件的方法实例

    以下是“Python中优雅处理JSON文件的方法实例”的完整攻略。 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON是通过对象和数组的嵌套来实现对数据的描述。 在Python中,可以使用内置的json库来对JSON数据进行解析和处理。 加载JSON…

    C 2023年5月23日
    00
  • MathWorks MATLAB R2022a中文版激活密钥+详细安装教程(含下载)

    下面我为你详细讲解“MathWorks MATLAB R2022a中文版激活密钥+详细安装教程(含下载) ”的完整攻略。 下载MATLAB R2022a 首先,你需要进入官网下载MATLAB R2022a的安装文件。在下载页面选择“试用版”,然后选择相应的操作系统,下载完成后解压。 安装MATLAB R2022a 点击解压出来的“setup.exe”文件,选…

    C 2023年5月22日
    00
  • VC++操作SQLite简单实例

    下面是VC++操作SQLite简单实例的完整攻略: 一、前置条件 在开始操作SQLite之前,需要先安装以下两个软件: SQLite3:下载地址为https://www.sqlite.org/download.html,根据操作系统选择对应的版本进行下载安装。 SQLite3 ODBC驱动:下载地址为https://www.ch-werner.de/sqli…

    C 2023年5月22日
    00
  • C++两个cpp文件间如何进行各自函数的调用方式

    当我们在一个项目中有多个 C++ 源文件时,我们需要知道如何在不同的文件中调用其它文件的函数。 下面是两个cpp文件间如何进行各自函数的调用方式的攻略: 声明和定义 要在一个文件中使用另一个文件中定义的函数,我们必须将该函数的定义标记为 “extern”,并在需要使用它的文件中进行声明。 例如,如果我们有两个文件,一个叫做 main.cpp 和另一个叫做 h…

    C 2023年5月23日
    00
  • Matlab如何实现函数重载?Matlab实现函数重载的方法

    Matlab是一门基于矩阵运算的高级编程语言,它支持函数重载。函数重载是指在同一作用域中可以定义多个同名函数,但是参数的类型、个数或者顺序不同。Matlab中实现函数重载可以提高代码的复用性和可读性,同时也能够提升程序的灵活性和可维护性。下面是Matlab实现函数重载的方法的完整攻略。 函数重载的基本原则 Matlab实现函数重载需要遵循以下的基本原则: 同…

    C 2023年5月22日
    00
  • Java8新特性:函数式编程

    Java8新特性:函数式编程 在Java8中,函数式编程成为了一项重要的新特性。函数式编程的核心思想是将函数作为一等公民来处理,这意味着函数可以被当做参数传递,也可以被当做返回值返回。Java8通过引入函数接口、Lambda表达式、方法引用等特性来支持函数式编程。 函数接口 函数接口是函数式编程的关键组件之一,它是一个只有一个抽象方法的接口。Java8中提供…

    C 2023年5月23日
    00
  • C语言实现输入两个数字将其按从小到大输出的方法

    以下是C语言实现输入两个数字将其按从小到大输出的方法的攻略: 步骤一:设置两个变量,输入两个数字 例如: #include <stdio.h> int main() { int a, b; printf("请输入两个整数: "); scanf("%d %d", &a, &b); return…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部