题目链接:http://poj.org/problem?id=3302
题意: 给定两个字符串,求第二个字符串是否为第一个字符串正向或反向的子串。
直接按s2中的字符在s1中搜索,有两个地方要剪枝,一是当s2的长度大于s1时,还有当s1剩余字符无s2的当前字符时。
#include<cstdio>
#include<fstream>
#include<iostream>
#include<cstring>
using namespace std ;
int n, i, j ;
char s1[101], s2[101] ;
bool is_sub(){
int s1_len = strlen(s1) ;
int s2_len = strlen(s2) ;
int sn=0, t=0 ;
int find=0 ;
if(s2_len>s1_len) return false ; //剪枝
for(i=0; i<s2_len; i++){ //正向
find=0 ;
for(j=t; j<s1_len; j++){
if(s1[j]==s2[i]){
sn ++ ;
t = j+1 ;
find = 1 ;
break ;
}
}
if(sn==s2_len) return true ;
else if(find==0) break ; //剪枝
}
sn=0 ;
t=0 ;
for(i=s2_len-1; i>=0; i--){ //反向
find=0 ;
for(j=t; j<s1_len; j++){
if(s1[j]==s2[i]){
sn ++ ;
t = j+1 ;
find = 1 ;
break ;
}
}
if(sn==s2_len) return true ;
else if(find==0) break ;
}
return false ;
}
int main(){
fstream cin("input.in") ;
cin >> n ;
while(n--){
cin >> s1 >> s2 ;
if(is_sub())
cout << "YES" << endl ;
else
cout << "NO" << endl ;
}
return 0 ;
}
#include<fstream>
#include<iostream>
#include<cstring>
using namespace std ;
int n, i, j ;
char s1[101], s2[101] ;
bool is_sub(){
int s1_len = strlen(s1) ;
int s2_len = strlen(s2) ;
int sn=0, t=0 ;
int find=0 ;
if(s2_len>s1_len) return false ; //剪枝
for(i=0; i<s2_len; i++){ //正向
find=0 ;
for(j=t; j<s1_len; j++){
if(s1[j]==s2[i]){
sn ++ ;
t = j+1 ;
find = 1 ;
break ;
}
}
if(sn==s2_len) return true ;
else if(find==0) break ; //剪枝
}
sn=0 ;
t=0 ;
for(i=s2_len-1; i>=0; i--){ //反向
find=0 ;
for(j=t; j<s1_len; j++){
if(s1[j]==s2[i]){
sn ++ ;
t = j+1 ;
find = 1 ;
break ;
}
}
if(sn==s2_len) return true ;
else if(find==0) break ;
}
return false ;
}
int main(){
fstream cin("input.in") ;
cin >> n ;
while(n--){
cin >> s1 >> s2 ;
if(is_sub())
cout << "YES" << endl ;
else
cout << "NO" << endl ;
}
return 0 ;
}