题目描述:
最后的挑战终于到了!
站在yifenfei和MM面前的只剩下邪恶的大魔王lemon一人了!战胜他,yifenfei就能顺利救出MM。
Yifenfei和魔王lemon的挑战很简单:由lemon给出三个字符串,然后要yifenfei说出第一串的某个子串,要求该子串长度最小,并且同时包含第2个串和第3个串。
特别地,如果有多个这样的子串,则请输出字母序最小的一个。
站在yifenfei和MM面前的只剩下邪恶的大魔王lemon一人了!战胜他,yifenfei就能顺利救出MM。
Yifenfei和魔王lemon的挑战很简单:由lemon给出三个字符串,然后要yifenfei说出第一串的某个子串,要求该子串长度最小,并且同时包含第2个串和第3个串。
特别地,如果有多个这样的子串,则请输出字母序最小的一个。
这道题觉得.Net做起来应该很轻松吧,数据量很小,就不用KMS之类的了,直接搜两个字串,有一个没找到就输出No,都找到说明肯定存在
继续,暴力搜第一个字串的所有位置,保存,第二个字串的所有位置,保存,然后两层循环,取出包含这两个位置的所有子串并记录,再用Linq把搜素到的子串按长度、字典序排序,输出第一个就行了,AC代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace a1
{
class Program
{
public static void Main(string[] args)
{
string str="";
str=Console.ReadLine();
int n=Convert.ToInt32(str);
while(n-->0){
string c=Console.ReadLine();
string a=Console.ReadLine();
string b=Console.ReadLine();
if(c.IndexOf(a)<0 || c.IndexOf(b)<0){
Console.WriteLine("No");
continue;
}
List<int> at=new List<int>();
List<int> bt=new List<int>();
List<string> ct=new List<string>();
//所有存在字串a,b的位置求解
for(int i=0;i<c.Length-a.Length;i++)
if(c.Substring(i,c.Length-i).IndexOf(a)==0) at.Add(i);
for(int i=0;i<c.Length-b.Length;i++)
if(c.Substring(i,c.Length-i).IndexOf(b)==0) bt.Add(i);
int[] aa=at.ToArray();
int[] bb=bt.ToArray();
for(int i=0;i<aa.Length;i++)
for(int j=0;j<bb.Length;j++){
int p=aa[i]<bb[j]?aa[i]:bb[j];
int q=(aa[i]+a.Length-1)>(bb[j]+b.Length-1)?(aa[i]+a.Length-1):(bb[j]+b.Length-1);
ct.Add(c.Substring(p,q-p+1));
}
string[] cc=ct.ToArray();
cc=cc.OrderBy(s=>s.Length).ThenBy(s=>s).ToArray();
Console.WriteLine(cc[0]);
}
}
}
}