hdoj 5311 Hidden String 【dfs(递归)】【周赛】

来源:互联网 发布:淘宝lol代练 编辑:程序博客网 时间:2024/06/05 08:34

Hidden String

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 1691    Accepted Submission(s): 597


Problem Description
Today is the 1st anniversary of BestCoder. Soda, the contest manager, gets a string s of length n. He wants to find three nonoverlapping substrings s[l1..r1]s[l2..r2]s[l3..r3] that:

1. 1l1r1<l2r2<l3r3n

2. The concatenation of s[l1..r1]s[l2..r2]s[l3..r3] is "anniversary".
 

Input
There are multiple test cases. The first line of input contains an integer T (1T100), indicating the number of test cases. For each test case:

There's a line containing a string s (1|s|100) consisting of lowercase English letters.
 

Output
For each test case, output "YES" (without the quotes) if Soda can find such thress substrings, otherwise output "NO" (without the quotes).
 

Sample Input
2annivddfdersewwefarynniversarya
 

Sample Output
YESNO
 

Source
BestCoder 1st Anniversary ($)
 

Recommend
hujie   |   We have carefully selected several similar problems for you:  5594 5593 5592 5591 5590 
 

Statistic | Submit | Discuss | Note



思路:
这道题用的是递归的方法,因为如果你用遍历的方法的时候如果输入这个样例就会出错:
annianniverannisaannrianniannianniversary
的时候就会出错!因为每次都尽可能多的将字符存到前面的子串里面,最终前面有很多和主串相同的字符,但是最后有一个整的,

最终会使你的串的个数超过3,所以不能这样查找!应该从第一个字符开始进行找和b数组(也就是主串里面的字符相同的字符)找到之后继续匹配,遍历一遍所有的起点与b[0]相同的字符,来查找有没有anniversary!

//因为第一个起点的位置不确定有可能有多个,同样第二个起点的位置也
//不确定,第三个起点的位置也不确定所以就要采用递归的思想来查找所有的 
//可能的起点所能造成的结果中有没有满足题意的结果! 

AC代码:
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;char a[105];char b[20]="anniversary";int len;int flag;void dfs(int p1,int p2,int cnt){if(cnt>3){return;}if(p2>=11){flag=1;return;}for(int i=p1;i<len;i++){int x=i,y=p2;while(a[x]==b[y])x++,y++;dfs(x+1,y,cnt+1);//不相等,那么就继续往后找下一个区间 } }int main(){int T;scanf("%d",&T);while(T--){flag=0;scanf("%s",a);len=strlen(a);dfs(0,0,0);if(flag)printf("YES\n");elseprintf("NO\n");}return 0;}


附带错误代码:

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;char a[105];char b[20]="anniversary";int main(){int T;scanf("%d",&T);while(T--){scanf("%s",a);int len=strlen(a),t=0,cnt=0,flag=0;for(int i=0;i<len;i++){if(a[i]==b[t]){t++;if(flag==0)//刚开始匹配成功 {flag=1;cnt++;}}else{flag=0;}}if(cnt<=3&&t==11){printf("YES\n");}else{printf("NO\n");}}return 0;}



0 0
原创粉丝点击