获取两个字符串中最长相等的字符串
例:“likeyou”和“loveyou” 输出“eyou”
前段时间面试遇到的面试题,当时的想法是首先将字符串拆分成字符数组,然后拿两个数组去做比较,可惜由于基础不是很扎实,当时的for循环比较写成了这个样子
for (int i = 0; i < arrStr1.length; i++)
{
for (int j = 0; j < arrStr2.length; j++)
{
if (arrStr1[i] == arrStr2[j + cnt])
{
str += arrStr1[i].ToString();
cnt++;
break;
}
else{
continue;
}
}
}
感觉有问题但是当时又想不到问题出在哪,然后连面试的机会也没有了。。。=_=
后来发现自己当时的问题是随意改变了外层for循环的指向,导致后边循环的乱套了。。。。
现在的理解思路是,首先要保证arrStr1的指向不变,然后挨个去和arrStr2数组的每一个值去做比较,如果相等,就拿arrStr1的下一个值来和arrStr2的下一个值比较(问题就在这里,不应该通过循环外层的for循环来让arrStr1获取下一个值,而是应该让arrStr1的指向不变,通过i+cnt来获取下一个值),如果不相等,那么循环外层for循环,改变arrStr1的指向来获取数组的下一个值,然后重复上边的比较操作,最后经过些许完善得出下面的方法
public static string Show(string CompareStr1, string CompareStr2)
{
//将两个字符串拆分成字符数组 使用ToCharArray方法
var arrStr1 = CompareStr1.ToCharArray();
var arrStr2 = CompareStr2.ToCharArray();
List<CompareResult> list = new List<CompareResult>();
var str = "";
var cnt = 0;
for (int i = 0; i < arrStr1.Length; i++)
{
str = "";
cnt = 0;
if (!arrStr2.Any(o => o == arrStr1[i]))
{
continue;
}
for (int j = 0; j < arrStr2.Length; j++)
{
if (i + cnt >= arrStr1.Length)
{
i = arrStr1.Length;
break;
}
else if (arrStr1[i + cnt] == arrStr2[j])
{
str += arrStr1[i + cnt].ToString();
cnt++;
}
else
{
if (cnt > 0)
{
break;
}
}
}
list.Add( new CompareResult { KeyStr = str, KeyCount = cnt });
}
var result = list.OrderByDescending(o=>o.KeyCount).FirstOrDefault();
return result.KeyStr;
}
//定义一个类,用来存放紧邻字符的相同字符串以及其字符个数
public class CompareResult
{
public string KeyStr{ get; set; }
public int KeyCount { get; set; }
}
原文地址:https://www.cnblogs.com/wangxiaojun1/p/11406224.html
时间: 2024-10-04 02:45:13