QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4230|回复: 6
打印 上一主题 下一主题

间隙字符串匹配问题(c++)

[复制链接]
字体大小: 正常 放大
lynnyan        

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:37 |只看该作者 |正序浏览
|招呼Ta 关注Ta
<>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P>. y# z2 E  }* m& D/ V8 b# c$ Q
<>[
游客,如果您要查看本帖隐藏内容请回复
[/hide]</P>#include &lt;iostream&gt;
2 ^' H; F# _0 \/ M, V, K3 v" V% i#include &lt;fstream&gt;
" L) B  q1 W$ h2 ousing namespace std;) @3 U  e" b$ L: b0 ^
ifstream in("input.txt");4 Q3 S* ?8 G8 |+ h: m  C' W
ofstream out("output.txt");
) }- }' n+ l, f. r4 q9 Lclass String
& g6 Y( w1 ]0 [) a+ ]  }$ z1 E4 n{
: i# @5 `3 \( ~* V8 J  public:. L# t9 y8 h; b$ p' m1 `1 w. J
String(char *s="");
  ]. V8 p) U# |. v* `# L; W String(const String&amp; s);7 v4 ^. v% `/ t, i  F. W3 k
~String();; z* ?* e9 b4 q; O+ u
int Length() const;" u+ G/ G3 `: A0 P& m* Z
int ReadString();* [7 v( i  ~: v  ]' l
int Rs();
' P) s* X; p6 L6 u  S void Prefix();
2 G) A# _7 w# ]8 ?1 w$ T5 N9 c void ModifiedPrefix();* w; ?8 k" c6 F
int Match(int i,String&amp; t);
4 h& j- v4 p8 T  private:) f( i* s3 t8 Q( ^% T6 @% z
   char *str;; p' \8 F) R) ^3 d
   int *pre;
& y9 w% C* \! y% I, y4 c0 X% a   int size;# c! B. l7 ^4 U7 I3 @5 m
};0 x  k1 u. U" W- o6 T
String::String(char *s)
. x6 g8 f& N  Y( V7 \6 ^9 _2 W6 z- [+ @{% e$ a7 [3 i: }' X9 V( h2 v
size=strlen(s)+1;1 P- i9 V% P/ |: P3 r. f
str=new char[size];- ^" x5 T* U8 }
if(str==0)8 ?' r8 X: S/ W( T8 ]! T9 |! ^4 B
  throw "error";
. N: t$ M" q7 u$ Z strcpy(str,s);
; Q5 b0 j6 J( c4 v9 c pre=new int[size];
* B8 c0 Q" v# M! B) B4 s0 x1 R& x/ c if(pre==0)0 s) f7 r" @! c: e
  throw "error";  K9 h9 M2 ^  A4 O! K
}
5 z% V3 O$ a4 `8 fString::String(const String&amp; s)
: ?5 Y7 D! m6 e2 e9 v% i{
& Y' C9 G9 S8 N/ w) `: l size=s.size;
) E2 {2 T4 H/ e! p str=new char [size];
9 K9 c' [3 S3 r, Y' N if(str==0)
# \# _; u$ ]6 z# H  throw "error";' U4 |9 ], X$ D2 t  i& ?
strcpy(str,s.str);
4 b- n% q7 ]7 u- a" V2 R8 Z$ n- t6 q pre=new int [size];
( B% m0 w8 Y7 Q6 h' [, e if(pre==0)
. N& g% S( t1 M/ _3 t: w, X  throw "error";
8 K- t1 o) z+ h5 Y0 f2 l}! z% |: X7 s1 ^/ _  D, o
String::~String()0 A; {/ V7 {) d2 g
{+ M/ `) c9 P, |# r/ V0 `: |1 n
delete [] str;
( `' P8 U7 z! n; A& w3 o$ ~3 j1 G delete [] pre;
7 `0 W5 X1 T$ e! L9 X( \}
, M: K% ?+ E/ a; b1 Sint String:ength() const; b2 I# m* y0 k0 S6 _) g5 g
{
3 c% U# k$ [7 \0 ~0 k! q return size-1;5 c2 ^% |; g+ ?
}
+ j: h, D2 Q6 E0 W# A$ Cint String::ReadString()4 L6 H3 K1 }; G0 y
{
8 G+ e) r9 A# G( ^; | char tmp[256];1 \- T5 H, B) x7 q5 ~
    if(in&gt;&gt;tmp)8 K$ \: B  a5 E0 {# R7 u6 N
{
' Y4 c7 J2 v0 w  delete [] str;* Z. X' o( F' @6 E- z4 q
  size=strlen(tmp)+1;6 ], i. t& l' c. S" Z
  str=new char [size];
* _4 |9 p( Y9 p* z# r5 W  strcpy(str,tmp);
* L! q( @9 [: F5 i  return size-1;' z% a0 f5 T5 b" a
}8 E2 I# o4 f2 [7 E: ^
else' I7 u) i% k1 q! \5 B- f5 y
  return -1;/ {, I+ A' x( m! S/ b" k7 P
}0 A+ I  t% T" J; V7 I" m* ~! K
int String::Rs()
  s" H5 O6 _, v  ~. L{
) _+ s0 N. J: m char tmp[256],c;. l+ C% `. `4 T% D9 U" w& M. ]
int i=0;
: j" b" _$ v+ v, k3 H while(in&gt;&gt;c)
% E7 h9 I+ E) Y% z2 c% Z2 \& S {6 u& s. e& L! P. ^& a
  if(c!='*')
9 v$ h; G- Q& e3 H" ?5 r  tmp[i++]=c;
- I9 }% S! t( M  Q  else if(c=='*'&amp;&amp;i&gt;0)$ p, W2 E, H/ \
   break;5 j2 U4 J9 u  H* X' U! ?
}
. [/ E8 g& y) f# C5 f  w if(i&gt;0)/ Q9 s4 F+ @8 d! l8 N
{
7 e* q0 Y, E/ I# I  delete [] str;) i4 ?: I& Q+ x7 \) Y9 k+ c) V# e
  size=i+1;
) ~  f" r8 m' T6 h  str=new char[size];
" L) k, X) @/ |0 \- L0 [$ N  if(str==0)
- f5 z& x" Z5 R* B$ q7 P   throw "error";- H# T. P% k! ]$ O; {/ I
  for(i=0;i&lt;size-1;i++)- B! N  Y6 B) {. z  x; ^
      str=tmp;  / U: W& q* k4 Z! s3 Q" p  m, B
  return size-1;# n1 _4 @6 _7 [. ~( M
}
7 u+ M7 V' k# }+ [ else
/ J0 K  L2 g. r- j# X3 S  return -1;
7 w( b/ ]7 g, F, G$ n$ c}% G2 u( D/ a4 }# w  ?3 L$ X
void String:refix()% e' ^: ^% x5 V( \& T1 U
{
& ~( h/ F/ S/ C' c% O" w" m5 w int m=Length();
  Y! N# C) y0 N( T2 v, n delete [] pre;
8 M& Y: s0 B. i  P6 W' N) _ pre=new int [m+1];
9 J2 m: r' a; w pre[1]=0;
- i, l0 L& T2 ?; p, j& f int k=0;
: p. M4 ^% J1 O7 X0 }& t for(int i=2;i&lt;=m;i++)
9 r+ y/ V- c  ?+ O2 z" W2 h; m/ c {5 t) E, @/ b7 k4 w* |5 ^
  while((*(str+i-1)!=*(str+k))&amp;&amp;(k&gt;0))! Y+ K  k8 B. t: H  y
   k=pre[k];7 j( A2 B) K8 K- R' l
         if(*(str+i-1)==*(str+k))
1 h/ O' f5 v0 e' _9 e# B! N0 Q; [* l    pre=++k;0 ^8 d+ u% P2 r* L
   else
" W- ^( u* k! \/ o( g+ K    pre=0;8 Y6 n0 b( i' G" G3 ^) _" Y$ W
}. [, g7 M8 [0 R0 M- }5 G  ^
}& Q) J/ g9 W! v/ f2 ^
void String::ModifiedPrefix()- b4 A; G: M1 \, f
{) }! `" H! q% u" s! r3 a- C+ P
int *f;& n1 x" G0 m7 l7 Y8 K$ D7 Y
int m=Length();
% M' v5 F! ~1 I6 q% f: Y* Q f=new int[m+1];% Q- T5 i* V, }& b
Prefix();' S6 H( N3 v9 N
for(int i=1;i&lt;=m;i++); {" C& {! R0 \' Q* p
{4 \/ l; }  N9 {) U3 O( i$ |
    f=pre;
1 m; u/ ?8 j" Y5 Q* l, u2 | }2 h1 g" Q4 l) g  v9 i4 \8 D! }
for(i=1;i&lt;m;i++)
" e6 B; C% @2 I3 K+ \6 ] {5 @0 y* |! ^  N' y) Z
  int k=f;6 C- X& y- }7 q' g7 c0 y
  if((k==0)||(*(str+i)!=*(str+k)))
3 |$ h0 s& d5 S   pre=k;
+ b3 J6 {% u( l  else . M3 v* x7 ~; E& F  i
   pre=pre[k];( W6 R0 L; V  ^' ^2 L* ]! b; n
}
9 V* e5 B3 Z$ r) }- I+ B  i$ p" d" C delete []f;3 ~, p9 R0 K7 s  F& w
}
1 F/ X# g, p- H7 V' S: N8 D1 ^: lint String::Match(int i,String&amp; t)* ?1 @" }/ C! _" w2 g8 I) b- {
{
7 |5 z" e  r4 C1 v int j=0;
% R. Y: t4 o  }5 B* J8 A int n=Length(),m=t.Length();7 c) ]5 B2 I* Z# s: \3 X4 a" M8 J
t.ModifiedPrefix();! p. d% A6 ^% v0 D) V# L
while((i&lt;=n)&amp;&amp;(j&lt;m))& s# b; [3 f8 Z9 F3 ?1 o! Z7 o
  if(str[i-1]==t.str[j])
4 q1 X, ~1 C+ z% T$ y9 w  {
) \' ]8 R2 N: j/ B2 G   i++;
$ {$ z% E; {5 z3 w; n6 l   j++;4 r. C) q& ]8 W& E0 V
  }
  V9 @4 K. g3 T# o* n  else " N% M6 b8 z8 y5 f7 j, H2 Y
   if(j==0)
# S% d8 y; P$ f+ y0 g# T. ]. U        i++;
2 y% O6 t9 ]  j( A" F! K! [      else : I! p: l; j1 Q  y# [9 I
    j=t.pre[j];7 R: O1 T- d6 W  ?& y
  if(j&lt;m)
9 ]& i6 H' ^& t3 B& I0 i   return 0;& K, R+ y0 Q% O& r1 K  z
  else   g4 k$ p& h( z6 p, L7 W) U
   return i-1;
% L( L- K$ Y% Y2 Y3 D# ~) W}
2 \; |8 S/ |5 J. Cint main()8 h5 D/ T! r9 s0 e$ Y& z! {4 t6 c: c# e
{
4 [" }* v7 x5 Z( Z! ? if(in.fail())/ {0 _" \. J+ g# h( ^% ~
{2 B' j) B( d! X" V, i8 \+ g
  cout&lt;&lt;"the input.txt is not exist!";. d& _- L* ?) K& ^/ c% {4 w
  exit(1);}
' B* n% @+ c% O int i=1;3 y5 i2 Y) r8 V
String s,t;5 h* z& h% c0 g. ^2 ], p
s.ReadString();4 t% k% k& ]) ^" \( I& g
while(t.Rs()+1)
+ }8 b0 B% ~5 y. _ {
' g$ b' \, u6 Q. @. f/ a8 T  i=s.Match(i,t);
) w2 I5 D$ |. D! M/ d: ^9 q  if(!i)
1 V* A* G. W- Z  {
( |* U5 Q$ h2 C5 \( }; s      out&lt;&lt;"No"&lt;&lt;endl;
- F7 a# `+ G1 z) h2 y+ F9 n   break;
  d/ f" e. H8 g1 K) t0 d* x  }. @  R3 M$ i! r: L
}- z3 S: K5 g( K, l7 x
if(i)
: r9 P$ S2 h7 C: O8 a  out&lt;&lt;"Yes"&lt;&lt;endl;: D6 ^$ R4 d! ^- L+ i  }* @9 j1 a+ L
return 0;
: U* P& E! G4 L( q4 C/ G}

间隙字符串匹配问题(c++).rar

62.99 KB, 下载次数: 10, 下载积分: 体力 -2 点

间隙字符串匹配问题(c++)

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏1 支持支持0 反对反对0 微信微信
我相信今天的埋头苦读是明天的出人头地
ottiou 实名认证       

16

主题

5

听众

849

积分

升级  62.25%

  • TA的每日心情

    2017-9-14 18:53
  • 签到天数: 167 天

    [LV.7]常住居民III

    2013挑战赛参赛者

    新人进步奖

    群组开源分享

    群组数学专业考研加油站

    群组2013数模夏令营A题

    群组2013数模夏令营B题

    群组2013数模夏令营C题

    回复

    使用道具 举报

    0

    主题

    3

    听众

    72

    积分

    升级  70.53%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    0

    主题

    3

    听众

    22

    积分

    升级  17.89%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    ari0101        

    0

    主题

    3

    听众

    23

    积分

    升级  18.95%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    sgnswb        

    1

    主题

    3

    听众

    23

    积分

    升级  18.95%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    zidance        

    5

    主题

    3

    听众

    36

    积分

    升级  32.63%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-6-13 15:23 , Processed in 0.586688 second(s), 90 queries .

    回顶部