雅虎公司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日

相关文章

  • Qt 中开启线程的多种方式小结

    针对这个话题,我将会为大家提供一个完整的攻略。首先,我们需要明确的是,Qt 中开启线程的方式有多种,每种方式都有其优缺点,下面我将一一进行介绍。 方式一:继承 QThread 类 继承 QThread 类是使用 Qt 开启线程最为常见的方式之一。具体步骤如下: 定义一个继承自 QThread 的线程类,并重写其 run() 方法,在 run() 方法内实现我…

    C 2023年5月22日
    00
  • C语言的预处理介绍

    C语言预处理器是C和C++编译器的一个重要组成部分。预处理器的主要任务是在源代码编译前对代码进行预处理,生成编译器所需的代码,以及为程序提供预定义的宏。本文将详细介绍C语言的预处理,在此过程中将会讲解预处理器的使用方法,以及预处理器指令的作用。 预处理器的作用 C语言预处理器的主要作用如下: 头文件包含:用于将另一个文件中的内容插入当前文件的指令。使用头文件…

    C 2023年5月23日
    00
  • Fate/EXTELLA启动应用程序错误怎么办 0xc000007b错误的解决方法

    Fate/EXTELLA启动应用程序错误解决方案 问题描述 当尝试启动Fate/EXTELLA游戏时,可能会出现以下错误: “无法启动应用程序程序,因为计算机上找不到XXX.dll。请尝试重新安装该程序以解决该问题。” “应用程序无法正确启动(0xc000007b)。单击确定关闭应用程序。” 如果你在运行Fate/EXTELLA时遇到以上错误,那么你所面临的…

    C 2023年5月23日
    00
  • golang中的defer函数理解

    当我们在编写Go语言程序时,可能需要在函数执行结束前执行一些特定的语句,比如关闭文件资源,清理资源等。而defer语句就是用来解决这类问题的。 基本语法 defer语句可以在函数执行结束时执行一些最后的代码操作,无论函数是正常结束还是出现异常。可以用来关闭文件、解除锁定、记录时间等有用的操作。defer语句可以在函数中任何地方定义,但是推荐在函数开头定义,这…

    C 2023年5月22日
    00
  • C语言实现顺序表的基本操作的示例详解

    介绍 C语言是一门基础的编程语言,学习和了解C语言是一种基本的能力,实现顺序表是C语言中的一个常见问题。 什么是顺序表? 顺序表是一种线性结构,其中的元素在物理位置上是连续的。数组是一种简单的顺序表。 在顺序表中,每个元素的位置都能通过它在表中的下标计算出来。例如: int a[5] = {1, 2, 3, 4, 5}; printf("%d&qu…

    C 2023年5月30日
    00
  • C++中的运算符和表达式

    让我来给大家详细讲解一下C++中的运算符和表达式。 运算符 在编程中,我们需要使用各种运算符对数据进行各种操作,C++提供了以下几种运算符: 算术运算符 算术运算符用于基本的算术操作,如加减乘除和取模。具体如下: 运算符 描述 + 加法 – 减法 * 乘法 / 除法 % 取模(求余数) 示例代码如下: #include <iostream> in…

    C 2023年5月24日
    00
  • 深入理解C++中常见的关键字含义

    深入理解C++中常见的关键字含义 C++ 是一门功能强大的编程语言,拥有众多的关键字,每个关键字都有其特定的含义和用途。本文将对其中常见的关键字进行讲解,帮助读者更好的理解和应用C++语言。 auto 关键字 auto 的含义是自动类型推导。它可以让编译器自动推导出变量的类型,简化代码书写,同时不会影响程序的性能。 示例1: auto x = 5; // 推…

    C 2023年5月23日
    00
  • C语言深入讲解栈与堆和静态存储区的使用

    C语言深入讲解栈与堆和静态存储区的使用 什么是栈 栈是一种数据结构,具有先进后出的特点。在C语言中,栈通常用来存储函数调用的相关信息,例如函数的参数和局部变量等。C语言栈的大小是有限制的,当栈的使用超出其大小时,就会导致栈溢出。 栈的使用 C语言中的栈是由操作系统在运行时进行分配的。当函数被调用时,操作系统会分配一段连续的内存空间,用于存储该函数的参数和局部…

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