关于 从两个字符串中找出相同最长字符串的最优算法

copico 2011-12-10 04:45:04

string str1 = "abcdefdsafdsakl;jdsfkl;wjqr";
string str2 = "uiyoiweqrkjljdesakfvdefnxczv;ljsdaasd';oiew[r;slakjfa";


这个答案应该是 def

如何用算法找出这个字符串,要最优
...全文
718 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
天逆我愿 2013-11-01
  • 打赏
  • 举报
回复
那要是两个字符串的长度相同呢?如: String str1="abcdefgh"; String str2="bcdefghi" 当然,取出的字符串是"bcdefgh"。 各位大神,请怎么办?
苦苦的潜行者 2011-12-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xiaolinyouni 的回复:]
我的想法跟1楼一样,不过我还想到一个更简单的方法
FindMaxChildStr(str1,str2)
{
strTemp1=minLength(str1,str2)//首先比较长度,将长度短的赋给strTemp1
strTemp2=maxLength(str1,str2)//将长度长的赋给strTemp2
然后让字符串变量i遍历strTemp1字符串的子字符串
(如ABCDEFG,
……
[/Quote]

其中,不足的地方主要有两处,
1,如在ABCDFG,如果已经找到"ABC",就不用再检验小于"ABC"长度的字符串
2, 在找最大长度的字符串时,如果最大长度的字符串有两个,只会输出一个.
苦苦的潜行者 2011-12-10
  • 打赏
  • 举报
回复
vb.net版
    Sub Main()
Dim str1 As String = "abcdefdsafdsakl;jdsfkl;wjqr"
Dim str2 As String = "uiyoiweqrkjljdesakfvdefnxczv;ljsdaasd';oiew[r;slakjfa"
Dim strTemp1, strTemp2 As String
If Len(str1) > Len(str2) Then
strTemp1 = str2
strTemp2 = str1
Else
strTemp1 = str1
strTemp2 = str2
End If
Dim strPointer As String = ""
Dim arr As New ArrayList()
For i As Integer = 1 To strTemp1.Length
For j As Integer = 1 To strTemp1.Length - i + 1
strPointer = Mid(strTemp1, i, j)
If InStr(strTemp2, strPointer) <> 0 Then
arr.Add(strPointer)
End If
Next
Next
Dim MaxChildStr As String = ""
If arr.Count <> 0 Then
MaxChildStr = arr(0)
For Each strChild In arr
If strChild.Length > MaxChildStr.Length Then
MaxChildStr = strChild
End If
Next
End If
Console.WriteLine(MaxChildStr)
Console.ReadLine()
End Sub


转为C#
public void Main()
{
string str1 = "abcdefdsafdsakl;jdsfkl;wjqr";
string str2 = "uiyoiweqrkjljdesakfvdefnxczv;ljsdaasd';oiew[r;slakjfa";
string strTemp1 = null;
string strTemp2 = null;
if (Strings.Len(str1) > Strings.Len(str2)) {
strTemp1 = str2;
strTemp2 = str1;
} else {
strTemp1 = str1;
strTemp2 = str2;
}
string strPointer = "";
ArrayList arr = new ArrayList();
for (int i = 1; i <= strTemp1.Length; i++) {
for (int j = 1; j <= strTemp1.Length - i + 1; j++) {
strPointer = Strings.Mid(strTemp1, i, j);
if (Strings.InStr(strTemp2, strPointer) != 0) {
arr.Add(strPointer);
}
}
}
string MaxChildStr = "";
if (arr.Count != 0) {
MaxChildStr = arr[0];
foreach (object strChild_loopVariable in arr) {
strChild = strChild_loopVariable;
if (strChild.Length > MaxChildStr.Length) {
MaxChildStr = strChild;
}
}
}
Console.WriteLine(MaxChildStr);
Console.ReadLine();
}
苦苦的潜行者 2011-12-10
  • 打赏
  • 举报
回复

我的想法跟1楼一样,不过我还想到一个更简单的方法
FindMaxChildStr(str1,str2)
{
strTemp1=minLength(str1,str2)//首先比较长度,将长度短的赋给strTemp1
strTemp2=maxLength(str1,str2)//将长度长的赋给strTemp2
然后让字符串变量i遍历strTemp1字符串的子字符串
(如ABCDEFG,
然后A,AB,ABC。。,AB。。G;
B,BC,BC..G;
C,CD.....)
然后让i遍历strTemp2,如果i存在于strTemp2中就保存在Arraylist对象maxChildStr中,
直至最后,比较值的长度就会得到最大的子字符串了。
}
C#语法我不太会,一会我用vb.net写一个
q107770540 2011-12-10
  • 打赏
  • 举报
回复

路过。。看看
copico 2011-12-10
  • 打赏
  • 举报
回复
我自己帖上算法吧

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{


string str1 = "abcdefdsafdsaklasdfasddfsgdsfas;ewr53253221nxczv;ljsdaaefcvxsakgbvnmmfvdefnxczv;ljsdaasdadw2sfadfadsoiew[r;ssdadw2s51jdsf23klwerqewrq;wjqr";
string str2 = "uiyoiweqrkjljdefcvxsakgbvnmmfvdeflasdfasnxczv;ljsdaasdadw2sfadfadsoiew[r;slakjfa";

/*
*
* 先找第一个相同的,如果第一个有相同的,就跟着第一个进去,看第二个是不是相同的
* 如果第二也相同,那就再跟进去看第三个是不是相同
* 如果不同,那就跳到第二。按第二个找到最长的字符串
*
*
*/


Console.WriteLine(new Program().Get_long_public_str(str1, str2));
Console.Read();

}

public string Get_long_public_str(string str1, string str2)
{
ArrayList al = new ArrayList();
string resultStr = "";
string tmpStr = "";

for (int i = 0; i < str1.Length; i++)
{
if (resultStr == "")
{
tmpStr = this.Get_Str2_Index(str1, str2, i, 1);
}
else
{
if (i + resultStr.Length + 1 > str1.Length)
{
tmpStr = "";
}
else
{
tmpStr = this.Get_Str2_Index(str1, str2, i, resultStr.Length + 1);
}
}

if (tmpStr.Length > resultStr.Length)
{
resultStr = tmpStr;
}
}

return resultStr;

}

public string Get_Str2_Index(string str1, string str2, int i, int charCount)
{
string tmpChar = str1.Substring(i,charCount);

if (str2.IndexOf(tmpChar) > 0)
{
charCount = charCount + 1;

if (i + charCount > str1.Length)
{
return str1.Substring(i, charCount - 1);
}
else
{
return Get_Str2_Index(str1, str2, i, charCount);
}
}
else
{
return str1.Substring(i, charCount-1);
}
}
}
}


110,538

社区成员

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

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

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