如题:
例如:输入任意一个字符串:abcfeabcedefeabcvegedfeabcdedfe
运行结果把abc给打印出来。
求它的公共部分出现次数最多且长度最长的子串...
例如:输入任意一个字符串:abcfeabcedefeabcvegedfeabcdedfe
运行结果把abc给打印出来。
求它的公共部分出现次数最多且长度最长的子串...
解决方案 »
- C#中没有类似Delphi的ADOQuery,ClientDataSet一类的数据控件吗?
- .net中在DataGrid中添加RadioButton后数据绑定的问题。。。
- 急!!!C# winForm 不同窗口之间的事件调用问题
- webservice怎么加密
- 谁遇到过这样的Dll出错的,不知道是什么原因,高手帮忙。。。
- Image 怎么转成 Bitmap
- 请问在winform里怎样实现这样的效果!
- Thread 线程失去引用,但是为何却能依旧保持接收客户端套接字?
- 如何让WebBrowser支持window.resizeTo
- 在线等待,C#项目如何制作安装程序,要多少分给多少分
- 碰到一个事务方面的问题请教各位
- 讨论一下类似QQ的多人聊天
可能会用到:\s(?<xxx>\w+)\s\k<xxx>\s ,不保证这个正则表式正确,
只是提供一个可能的思路.
再跟据匹配看那个出现的最多,坐等高人
出现次数最多和长度最长肯定要有个优先级的,是先保证次数,还是先保证长度?但无论先保证哪个,都不会是楼主说的abc如果优先保证次数,那么字符e是出现次数最多的
如果优先保证长度,那么子串feabc是最长的如果源字符串比较短的话,用正则是可以做到的,如果比较长的话,那还是自己实现算法吧
private string GetMostAndLongestString(string sourceString)
{
string tempString = sourceString;
System.Text.StringBuilder sbString = new System.Text.StringBuilder(""); for (int getStringNum = 2; getStringNum < sourceString.Length; getStringNum++)//这层每次取多少个字符
{
for (int i = 0; i < sourceString.Length; i++)//从第一个字符开始
{
for (int j = i + getStringNum; j < sourceString.Length - (i + getStringNum); j++)//按上面的从第一个字符开始取多少个字符
{
int stringNum = 0;
string subStr = tempString.Substring(i, j);
if (tempString.IndexOf(subStr) != -1)//判断传进来的字符串中有没有tempString.Substring(i, j)字符
{
//返回的字符串数组包含此字符串中的子字符串(由指定字符串数组的元素分隔)。参数指定是否返回空数组元素。
stringNum = tempString.Split(new string[] { subStr }, StringSplitOptions.None).Length;//统计这个载取出来的字符在这个源字符串中有多少个
}
if (stringNum != 0 || stringNum !=1)//如果这个载出来的字符不等于零个或不等于一个就添加到结果字符串中
{
sbString.Append(subStr + ":" + stringNum + ";");//以键值对的方式保存
}
}
}
} //解析结果字符串
string returnString = sbString.ToString();
string[] strs = returnString.Split(new char[] { ';' });
string maxString = strs[0];
for (int i = 1; i < strs.Length; i++)
{
if ((GetValue(maxString) <= GetValue(strs[i])) && GetName(maxString).Length < GetName(strs[i]).Length)
{
maxString = strs[i];
}
}
return GetName(maxString);
} private int GetValue(string subStr)
{
string[] sts = subStr.Split(new char[] { ':' });
if (sts.Length >= 2)
{
return Convert.ToInt32(sts[1]);
}
else
{
return 0;
}
} private string GetName(string subStr)
{
string[] sts = subStr.Split(new char[] { ':' });
if (sts.Length >= 2)
{
return sts[0];
}
else
{
return "";
}
}
调用方法
GetMostAndLongestString("abcfeabcedefeabcvegedfeabcdedfe");
注意:"aaaaaaaaaaa" 这种情况的话 可能就不是你想要的结果了 这时返回为 aa