杭电2572

21 篇文章 0 订阅

题目描述:

最后的挑战终于到了!
站在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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值