SZSM面试题:写一个可以返回任意两个string串的最大公串的函数

火鸟李国平 2006-06-19 11:45:20
可以写实例函数出来,也可以说说算法思路
我当时写了一个,但认为应该还有更优解
...全文
404 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
火鸟李国平 2006-10-31
  • 打赏
  • 举报
回复
UP
shn228 2006-10-23
  • 打赏
  • 举报
回复
mark
shn228 2006-10-23
  • 打赏
  • 举报
回复
xuexi
火鸟李国平 2006-10-20
  • 打赏
  • 举报
回复
UP
feifeiyaqi2 2006-06-22
  • 打赏
  • 举报
回复
up
火鸟李国平 2006-06-22
  • 打赏
  • 举报
回复
在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则是在长串遍历整个短串的组合,这两者比较起来,也算是一个时间有优势,一个空间有优势的差别吧,不知大家还有没有更让人有启发的实现
搬运工木木 2006-06-19
  • 打赏
  • 举报
回复
呵呵,CSDN的字符串排列有问题...
第一步是只有一个字符串重叠
第X步是aaa的最后一个字符串和bbb的最后一个字符串重叠
搬运工木木 2006-06-19
  • 打赏
  • 举报
回复
楼主的算法可能比我想的高效,我也写一下,就当是抛砖引玉吧

不涉及语言,只是思想

开始比较时:
第一步
aaaaa
bbbbbbbbbbbbbbbbbbb

第二步
aaaaa
bbbbbbbbbbbbbbbbbbb
......

第X步

aaaaa
bbbbbbbbbbbbbbbbbbb

最后一步
aaaaa
bbbbbbbbbbbbbbbbbbb


只比较相个字符串重叠的部分,重叠部分要全部比较,不管中间有没有不相等的,也就是取重叠部分中最大公共字符串
在第 X 步和 最后一步之间的比较不是必需的,如果重叠部份已经小于已知MAX_LEN,则可中止比较了

aaa 和bbb 长短无所谓

感觉,楼主的算法比我的效率要高

yangxd_yi 2006-06-19
  • 打赏
  • 举报
回复
刚才写错了个字

感兴趣:
首先确定两个字符串的长度,长度分别为m 和n
假设我们m >= n
那么需要比较的最多比较次数为: 1+2+3+...+n次,最少比较次数为1
yangxd_yi 2006-06-19
  • 打赏
  • 举报
回复
感兴趣:
首先确定两个字符串的长度,长度分别为m 和n
假设我们m >= n
那么需要比较的最低次数为: 1+2+3+...+n次
火鸟李国平 2006-06-19
  • 打赏
  • 举报
回复
我的实现:
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;
}
搬运工木木 2006-06-19
  • 打赏
  • 举报
回复
我感觉最差的好像要大约m*n次比较(单字符串)
搬运工木木 2006-06-19
  • 打赏
  • 举报
回复
标记一下,楼主算法是怎么样的?
火鸟李国平 2006-06-19
  • 打赏
  • 举报
回复
我的思路:
1.确定一个串为长串,另一个串为短串,在长串中找短串(长串中最长的公串可能性就是短串本身)
2.顺序确定短串中的每个字符是否在长串中出现(先做一个预定位)
3.如满足条件2,即短串中某个字符在长串中出现,在长串中试图找从这个字符起到短串末尾止的整个串
4.如果不满足条件3,短串末尾递减1个字符,直到找到此次字符出现的最大长度(至少是一个字符)
5.把此次找到的字符长度,与临时变量比较,如果此次长度大于历史长度,重赋值返回值
6.重复2-5,直到短串末尾

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧