杭电2572

来源:互联网 发布:中国网文在国外知乎 编辑:程序博客网 时间:2024/06/09 16:51

题目描述:

最后的挑战终于到了!
站在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]);}}}}


0 0
原创粉丝点击