问题描述
- 字符串中最长并至少出现2次的子串
- 作为依依的好朋友,技术男沛沛在依依生日时送给他一个超长字符串 S 。沛沛要依依在其中找出一个最长的字符串 T ,使得 T 在 S 中至少出现了两次,而他想说的秘密就藏在 T 中。
由于字符串实在是太长了,依依总是找不到合适的 T 。于是依依请你帮他找到这个 T 的长度。【输入格式】
一行。一个字符串,即题目中说的S 。【输出格式】
一行。一个整数,表示最长的 T 的长度。【样例输入】
ababa【样例输出】
3「数据范围」
对于 30% 的数据,S长度 <= 100
对于 60% 的数据,S长度 <= 8000
对于 100% 的数据,S长度 <= 500000
解决方案
``` var q= ""ababa"".ToCharArray()
.GroupBy(x=>x)
.Where(g=>g.Count()>=2)
.OrderByDescending(g=>g.Count())
.FirstOrDefault();
Console.WriteLine( q==null?0:q.Count());```
解决方案二:
var q= ""ababa"".ToCharArray() .GroupBy(x=>x) .Where(g=>g.Count()>=2) .OrderByDescending(g=>g.Count()) .FirstOrDefault(); Console.WriteLine( q==null?0:q.Count());
解决方案三:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string s = ""依依我不爱你还能爱谁,依依我不爱你才怪"";
var query = Enumerable.Range(0 s.Length).Select(x => s.Substring(x)).OrderBy(x => x).ToArray();
int idx = 0; int max = 0;
for (int i = 1; i < query.Length; i++)
{
int same = query[i].Zip(query[i - 1] (x y) => x == y).TakeWhile(x => x).Count();
if (same > max)
{
idx = i; max = same;
}
}
Console.WriteLine(query[idx].Substring(0 max));
}
}
}
依依我不爱你
Press any key to continue . . .