Chinaunix首页 | 论坛 | 博客
  • 博客访问: 65330
  • 博文数量: 115
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-08 19:09
文章分类
文章存档

2015年(115)

我的朋友

分类: Python/Ruby

2015-08-06 16:51:41

原文地址:最长前缀 作者:runningdark

Description
一些生物体的复杂结构可以用其基元的序列表示,而一个基元用一个大写英文字符串表示。生物学家的一个问题就是一个这样的长序列分解为基元(字符串)的序列。对于给定的基元集合P,如果可以从中选出N个基元P1,P2,P3,...,Pn,将它们各自对应的字符串依次连接后得到一个字符串S,称S可以由基元集合P构成。在从P中挑选基元时,一个基元可以使用多次,也可不用。例如,序列 ABABACABAAB 可以由基元集合{A,AB,BA,CA,BBC} 构成。
字符串的前K个字符为该字符串的前缀,其长度为K。请写一个程序,对于输入的基元集合P和字符串T,求出一个可以由基元集合P构成的字符串T的前缀,要求该前缀的长度尽可能长,输出其长度。
Input
  输入数据的开头是基元集合P,包括 1..200 个元素(长度为 1..10 )组成的集合,用连续的以空格或者回车键分开的字符串表示。字母全部是大写,数据可能不止一行。元素集合结束的标志是一个只包含一个 “.” 的一行。集合中的元素没有重复。接着是大写字母序列T ,长度为 1..200,000 ,用一行或者多行的字符串来表示。换行符并不是序列T的一部分。
Output
只有一行,输出一个整数,表示基元集合P构成的字符串T的前缀的长度。
Sample Input
A AB BA CA BBC
ABABACABAABC
 
 

点击(此处)折叠或打开

  1. my $instr = "ababacabaabc";
  2. my @prefixes = ("a", "ab", "ba","ca","bbc");
  3. my @result;
  4. for my $index (1 .. length($instr)){
  5.     my $curstr = substr($instr, length($instr) - $index);
  6.     my $pref;
  7.     for(@prefixes){
  8.         if(substr($curstr, 0, length($_)) eq $_){
  9.             my $tpref = $_.$result[length($instr) - $index + length($_)];
  10.             $pref = $tpref if( !defined($pref) or length($tpref) > length($pref));
  11.         }
  12.     }
  13.     $result[length($instr) - $index] = $pref;
  14. }
  15. print $result[0];

阅读(227) | 评论(0) | 转发(0) |
0

上一篇:货币系统

下一篇:修理牛棚(Barn Repair)

给主人留下些什么吧!~~