上周五的MS一道面试题

题目要求:
写一个返回两个任意字串中最大公共串的函数,即abcdef 和 qcfbcc 返回值为bc语言不限

我的思路:
1.确定一个串为长串,另一个串为短串,在长串中找短串(长串中最长的公串可能性就是短串本身)
2.顺序确定短串中的每个字符是否在长串中出现(先做一个预定位)
3.如满足条件2,即短串中某个字符在长串中出现,在长串中试图找从这个字符起到短串末尾止的整个串
4.如果不满足条件3,短串末尾递减1个字符,直到找到此次字符出现的最大长度(至少是一个字符)
5.把此次找到的字符长度,与临时变量比较,如果此次长度大于历史长度,重赋值返回值
6.重复2-5,直到短串末尾

我的实现:
C#版
public static string GetPubMaxString(string Value1,string Value2)
{
 string result=null,stmp;
 int maxLen=0;
 if (Value2.Length>Value1.Length)//确保Value1是长串
 {
  stmp=Value1;
  Value1=Value2;
  Value2=stmp;
 }
 for (int i=0;i<Value2.Length;i++)
 {
  if (Value1.IndexOf(Value2[i])>-1)//长串中依次判断短串的每个字符是否出现
  {
   stmp=Value2.Substring(i);//截取短串中出现字符到末尾存入变量
   for (int ii=stmp.Length;ii>0;ii--)
   {
    if (Value1.IndexOf(stmp.Substring(0,ii))>-1)//长串中依次判断短串变量的左取子串是否出现
     if (ii>maxLen) //如果出现并且此串长度大于上串的长度
     {
      result=stmp.Substring(0,ii);
      maxLen=ii;
     }
   }
  }
 }
 return result;
}

 

当时在半年不用笔,旁边很吵(好像另一个面试在问Struts的问题)的情况下,十几分钟才想完写完,回家上机试验居然倒是一点错漏也没有,看来还没有老的不中用啊;当然,我相信还有更好的算法实现,拿出这个题目来和大家交流交流,希望能看到大家有启发性的思路和算法。

在CSDN上看到了soholi(天涯孤棹) 网友实现上更简洁的算法:
public static string GetLargePublicString(string A,string B)
{
 string shortString = A.Length > B.Length ? B : A;//取较短者;
 string longString = A.Length > B.Length ? A : B;//取较长者;
 for (int i = shortString.Length; i > 0; i--)//长度递减
 {
  for (int j = 0; j <= shortString.Length - i; j++)//位置递增
  {
   if (longString.IndexOf(shortString.Substring(j,i)) != -1)
   {
    return shortString.Substring(j, i);
   }
  }
 }
 return string.Empty;
}
真是可以算是不能再优雅简洁的实现了,唯一的缺点就是,这个算法的效率比我的那个实现稍微慢了一些,尤其是在两个文本串都比较长的情况之下,因为两个实现最核心的区别就在于,我那个GetPubMaxString是先定位确实存在的一个字符后,才开始找这个一定存在,但长度未知的公共串,而网友soholi(天涯孤棹) 的GetLargePublicString则是在长串遍历整个短串的组合,这两者比较起来,也算是一个时间有优势,一个空间有优势的差别吧,不知大家还有没有更让人有启发的实现

另外,经过了SM的面试笔试,MS的面试面试,终于获得了一个SM发饷,MS扛枪的影子战士的职位,人家已经在催我开工了,可是我还没有想好要不要去,真烦啊!

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值