SZSM面试题:写一个可以返回任意两个string串的最大公串的函数 可以写实例函数出来,也可以说说算法思路我当时写了一个,但认为应该还有更优解 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我的实现: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;} 感兴趣:首先确定两个字符串的长度,长度分别为m 和n假设我们m >= n那么需要比较的最低次数为: 1+2+3+...+n次 刚才写错了个字感兴趣:首先确定两个字符串的长度,长度分别为m 和n假设我们m >= n那么需要比较的最多比较次数为: 1+2+3+...+n次,最少比较次数为1 楼主的算法可能比我想的高效,我也写一下,就当是抛砖引玉吧不涉及语言,只是思想开始比较时:第一步aaaaa bbbbbbbbbbbbbbbbbbb第二步 aaaaa bbbbbbbbbbbbbbbbbbb......第X步 aaaaa bbbbbbbbbbbbbbbbbbb最后一步 aaaaa bbbbbbbbbbbbbbbbbbb只比较相个字符串重叠的部分,重叠部分要全部比较,不管中间有没有不相等的,也就是取重叠部分中最大公共字符串在第 X 步和 最后一步之间的比较不是必需的,如果重叠部份已经小于已知MAX_LEN,则可中止比较了aaa 和bbb 长短无所谓感觉,楼主的算法比我的效率要高 呵呵,CSDN的字符串排列有问题...第一步是只有一个字符串重叠第X步是aaa的最后一个字符串和bbb的最后一个字符串重叠 在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则是在长串遍历整个短串的组合,这两者比较起来,也算是一个时间有优势,一个空间有优势的差别吧,不知大家还有没有更让人有启发的实现 js 如何调用 C# 后台方法(返回值bool) 菜鸟问题 登录窗口登陆成功但是进入主窗口打开后登录窗口不关闭怎么回事 ImagList ,Handle问题 c#多态 字节数组的问题 在VS2005中怎么像VS2003中一样使用SQL2000作为数据源呢? 请教 DataSet.Merge 方法 (DataRow[]) pictureBox里图片颜色改变了???怎么办??? WebBrowser 里网页的连接为什么失效? 如何实现Vs2005.net中的自动输入功能 急问!数据类型问题
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;
}
首先确定两个字符串的长度,长度分别为m 和n
假设我们m >= n
那么需要比较的最低次数为: 1+2+3+...+n次
首先确定两个字符串的长度,长度分别为m 和n
假设我们m >= n
那么需要比较的最多比较次数为: 1+2+3+...+n次,最少比较次数为1
第一步
aaaaa
bbbbbbbbbbbbbbbbbbb第二步
aaaaa
bbbbbbbbbbbbbbbbbbb
......第X步 aaaaa
bbbbbbbbbbbbbbbbbbb最后一步
aaaaa
bbbbbbbbbbbbbbbbbbb
只比较相个字符串重叠的部分,重叠部分要全部比较,不管中间有没有不相等的,也就是取重叠部分中最大公共字符串
在第 X 步和 最后一步之间的比较不是必需的,如果重叠部份已经小于已知MAX_LEN,则可中止比较了aaa 和bbb 长短无所谓感觉,楼主的算法比我的效率要高
第一步是只有一个字符串重叠
第X步是aaa的最后一个字符串和bbb的最后一个字符串重叠
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则是在长串遍历整个短串的组合,这两者比较起来,也算是一个时间有优势,一个空间有优势的差别吧,不知大家还有没有更让人有启发的实现