题目要求:
写一个返回两个任意字串中最大公共串的函数,即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扛枪的影子战士的职位,人家已经在催我开工了,可是我还没有想好要不要去,真烦啊!