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

copico 2011-12-10 04:45:04

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


这个答案应该是 def

如何用算法找出这个字符串,要最优
...全文
783 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);
}
}
}
}


内容概要:本文详细记录了对一个Android ARM64静态ELF文件字符串加密机制的逆向分析过程。该ELF文件的所有字符串均被加密,无法通过常规strings命令或IDA直接识别。作者通过分析发现,加密字符串存储在.rodata段,其解密所需信息(包括密文地址、长度和16位密钥)保存在.data.rel.ro段的40字节描述符。核心解密函数sub_10F408采用自反的双pass流密码算法,结合固定密钥KEY_TERM(由.data段24字节数据计算得出),实现字节级非线性、位置与长度相关的加密。文章还复现了完整的Python解密脚本,并揭示了该保护机制的本质为代码混淆而非强加密,最终成功批量解密全部956条字符串,暴露程序真实行为,如shell命令模板、设备标识篡改、网络重置等操作。此外,文还提及未启用的自定义壳框架及其反dump设计。; 适合人群:具备逆向工程基础的安全研究人员、二进制分析人员及对ELF保护技术感兴趣的开发者。; 使用场景及目标:①学习ELF二进制字符串加密的典型实现方式与逆向突破口;②掌握从结构识别、函数追踪到算法还原的完整逆向流程;③理解“绑定二进制”的完整性校验设计及其局限性;④实践编写IDAPython脚本自动化提取与解密敏感数据。; 阅读建议:此资源以实战案例驱动,不仅展示技术细节,更强调逆向思维与验证方法,建议读者结合IDA调试环境,逐步跟随文步骤进行动态分析与算法验证,深入理解每一步的推理依据。

111,131

社区成员

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

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

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