QQ登录

只需要一步,快速开始

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

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

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

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P>
* e9 G2 Z" Y+ n, A7 h<>[
游客,如果您要查看本帖隐藏内容请回复
[/hide]</P>#include &lt;iostream&gt;, i' }0 r6 P. ^
#include &lt;fstream&gt;
# n: z+ r7 ^8 Y7 Yusing namespace std;# e3 M* `8 h& k3 h) A$ c
ifstream in("input.txt");
+ u/ @, t! M3 Vofstream out("output.txt");1 \: B/ w6 e& W3 r7 N
class String
9 H1 Q. z5 M' X- `{2 \: D" M$ }0 N* Y7 L( `
  public:8 l& U3 o% \2 L( Q" Z6 Z
String(char *s="");- N# v" I4 r! x) A( ^  i8 K$ v
String(const String&amp; s);
9 g4 ?* ^  T) q8 P3 q& F ~String();
" T: ?  T8 u' z; K; u8 m1 D int Length() const;
( r, U: q& e- K8 } int ReadString();: F9 F9 C7 X7 E' p& D
int Rs();
! ]6 Z( `' B- C4 H3 D void Prefix();, m4 M; |) _2 C: I" Z: }' G
void ModifiedPrefix();7 i( i; {8 N) J, T5 M; F
int Match(int i,String&amp; t);' o4 [, O4 y* F1 g2 t$ P% l
  private:
6 k. t' D. r; S5 l& l- Z# d   char *str;- V! k0 e7 J/ _
   int *pre;
; c) [: `) o% f9 a   int size;0 u# Z6 Q/ R/ A) I4 b' o
};$ P4 P+ O7 x) L4 Z: j% a
String::String(char *s)1 h6 E$ s* @$ S* Q8 X" q
{) B( s$ g* H( @0 k2 n( g& F  `
size=strlen(s)+1;3 w6 @4 Q: ?1 P! @, |( f
str=new char[size];1 c6 G' s: k$ h1 X6 u! X
if(str==0)6 M4 q& `9 L5 }" N+ o
  throw "error";
2 i. b% v  ?, I, n* n strcpy(str,s);* X( D+ |. r) N5 P- S7 \5 X9 N
pre=new int[size];+ w1 K, h( x! y+ ^, g  l
if(pre==0)
8 H$ `8 g" g; w# ~" n* m  throw "error";  f  J/ Z( i$ F' j: {
}
1 S' g: w% i4 P& e( U. Y4 |String::String(const String&amp; s), a( _! t" L& t/ H( F
{: a; ^# v$ |. b2 V
size=s.size;
! C0 h' R5 \. r str=new char [size];
- d: o4 h, ~' e9 K+ ^0 ?0 L if(str==0)/ }$ N+ W& C9 q! j9 E1 u6 m% G
  throw "error";# n& I2 D) q4 d; b5 h9 r
strcpy(str,s.str);
: [! q2 B$ u& L1 j0 u' u pre=new int [size];
$ F8 o3 G- D* q- H" W& j9 U0 d if(pre==0)) l- z$ G- N, H( L
  throw "error";# {" P+ t( K" N( f
}" g7 Q7 k" S' p! Q
String::~String(); k/ t" I9 m! L
{
0 ?7 X' I0 |! W6 j& c1 C! v delete [] str;
) Q1 I" s+ |+ F/ w- C delete [] pre;" \! {3 e; }4 K6 W% M( F. u
}
- T8 H1 E) |+ P" V. \: S, y; m" iint String:ength() const0 W; l+ n* n- a, ?  _
{5 B- ]/ w$ S" M3 `$ q5 D
return size-1;
. g) _' t0 @& u# ^3 l& p}4 j: f: K& K& ?1 v; u% G+ U
int String::ReadString()
! d. Y/ A/ O7 _6 h0 `; b{+ u: B$ U) C0 w1 |2 c
char tmp[256];8 [5 r$ r- I3 D2 k
    if(in&gt;&gt;tmp)0 [9 T4 A. v  C
{
0 v( v$ `  m- {' H% ]7 |  delete [] str;
* |. X8 {7 V/ _7 A, `1 Z; y  size=strlen(tmp)+1;- ]( j  a2 I. V0 s( `9 @( a+ J  h
  str=new char [size];
; ~- r& S- _4 v) t  strcpy(str,tmp);0 H# `3 `/ G) ^, T
  return size-1;
  r$ E6 E; h2 ~, w# R9 I }, M$ A, |0 R4 l' w8 }. |0 h7 i$ W$ `% G0 V
else
$ M4 G. X" H) i( t3 K  return -1;
. M6 o' g4 Z% U2 C$ w% I+ T}% ?" C4 k' r. h# w
int String::Rs()
3 ]* ?& Q" Z5 s, Z( i{3 Q& f  a* C2 y! `: e
char tmp[256],c;
" v0 L6 ^1 @2 j6 A5 D int i=0;
0 k; s1 r* z3 }3 u" q- r while(in&gt;&gt;c)
  M( w- }9 {# K! u {$ ~! Q/ `- f$ U( G/ W6 ^. W+ ?: g
  if(c!='*')
$ x* m6 v, l) Y- H' ]& V7 @  tmp[i++]=c;8 p6 {; G/ z! @- I6 B
  else if(c=='*'&amp;&amp;i&gt;0)( [  e: b2 ~) i/ w/ Y
   break;
6 Y1 ~* {0 Z1 T }
# h7 N4 Q. S! B. ^9 y9 T$ V+ l if(i&gt;0); a& C4 o- ]( H4 g( v
{6 @5 f$ X( B' \/ Y0 n$ O9 T0 f1 z
  delete [] str;
6 u) d+ m# [5 v7 X! A( A* k8 i" {  size=i+1;
* A; a% u! x6 g! O  str=new char[size];
2 O: L  z1 ?. C  J  if(str==0): u; \/ l: h/ q2 }$ Y: ~
   throw "error";
1 I, f- ^( `: e( N/ `  for(i=0;i&lt;size-1;i++)
" p9 F$ w5 y: t5 G( ]- x      str=tmp;  , L! ]5 B4 Q, y: V) q/ M9 `
  return size-1;
- A) L8 H' V. v" r! f1 a  F& i }
6 {7 h+ g. s! a( l7 V4 y else
- Q& K+ s: d7 p0 k  return -1;: i0 S# W. I9 \3 w& P+ \% z: I) E! r
}
! O. |. _) Y) j! f: {+ _void String:refix()
6 B2 I4 ~8 s  t/ w/ H. b{
* v1 O1 S% D4 n' a6 w, g0 k int m=Length();: X9 @$ w  [0 W
delete [] pre;" Q% b6 |5 U) D* u$ }# Z6 h
pre=new int [m+1];
; q; ?, |2 F* q$ i* l3 Q pre[1]=0;
: z% ?0 r! ]! j* U) H6 L' J int k=0;. f4 I2 F) M1 l* a" X# w+ [
for(int i=2;i&lt;=m;i++)( H' A# p) H, p+ n! n# ^0 q! C
{
* \) ]# Y) B/ R, p: j& p" I  while((*(str+i-1)!=*(str+k))&amp;&amp;(k&gt;0))
1 [/ {6 k! `& A+ K7 |( s7 J, P   k=pre[k];$ h6 h/ c% h# p  u; T
         if(*(str+i-1)==*(str+k))9 L& ]+ `1 `; E. |5 m- _; ]
    pre=++k;9 c. D# t2 ~( ]6 ~: s  w, S
   else$ E- f1 C5 I2 v- h
    pre=0;4 d. l2 x" q. K) e4 c& }: Z
}  Z. n% G% Q$ ~( Z1 Y; u
}8 K: ~( p1 g3 M  X
void String::ModifiedPrefix()8 o" t. D4 Q9 C( o! I3 {# ?
{
: P2 R6 C. H" O$ J6 x) y+ E6 z int *f;/ R% O6 z- T/ R$ D( Y/ F" N
int m=Length();, i, Y! L. S# G3 ^/ a" R; w
f=new int[m+1];& q* g" y6 u2 G! _
Prefix();( G, O! q# k! F+ I: e$ Z
for(int i=1;i&lt;=m;i++)! _. x& w8 [3 C9 I& j5 w& z
{
7 m! e4 c! p4 Z3 J8 i    f=pre;
$ ?# @& ~( ~5 r+ h0 X! `9 z6 L }
) ^4 d( Q  e5 G% f for(i=1;i&lt;m;i++)
5 I$ g  i( |: y. p4 j* C4 q {$ I8 g9 ]0 b8 a! O" j  W" K
  int k=f;
: u* h! Z1 y0 {5 B2 ?& E  if((k==0)||(*(str+i)!=*(str+k)))) n) }5 G5 o( L9 y7 m! Z
   pre=k;: J1 l4 ^3 T# |9 r* A8 t1 l# I4 B/ e
  else
3 z, G" _% a. f* J" ^9 w   pre=pre[k];& Z2 _: L9 T  Z2 N' v: [
}
; S* d( y4 Z7 s( G9 ?' N5 v delete []f;
! B5 ]! o+ r# L4 `( B) j! s}
- |4 `- p% J# Z( p9 L* ]8 k3 Dint String::Match(int i,String&amp; t)
# w1 _, `$ B0 p* t) l, t. D) }{  X4 d9 E& a$ B" E- Z3 P& o2 J/ s
int j=0;
1 M. I# ~) ^: C% V# a! Z/ m int n=Length(),m=t.Length();0 @# Q: a9 W0 l) L7 h; d% y4 t
t.ModifiedPrefix();4 e# }% l' [0 D6 F, x
while((i&lt;=n)&amp;&amp;(j&lt;m))! O5 N! L; H" i0 I2 l: W
  if(str[i-1]==t.str[j])2 c- |$ p7 [5 n8 b1 x( S0 z* M
  {
2 X5 L4 A; l: T   i++;
% X. k% k, M2 d: A/ |" T0 d   j++;
/ ]/ m2 q: K$ ~( k* @- C+ m- a4 t! a  }& n# p4 \" e2 J* o0 `
  else 1 Y  H! u5 J- M# z9 K$ g
   if(j==0). x  T4 F7 |3 G4 T/ Q0 ^6 A0 O
        i++;% \( ^$ U$ S) I: I0 O& g# F, e
      else + o- d  t1 }" Z( F
    j=t.pre[j];+ M$ I( Z" {8 H4 N5 ^! w
  if(j&lt;m)6 `* }$ M/ L# I8 {& ?$ Y6 _
   return 0;
9 z/ Q. {) P  o  }  else
/ ^3 ?5 H: |, G) r. {) a   return i-1;
' P# b% \7 y* C; w( F. H}! o# F1 [9 y$ b4 f& E! I* l4 y
int main()
# t  Q* f* e- E1 N9 T3 c{
0 A; n1 i5 A: }; Z' g: c8 _3 V if(in.fail())! _( H+ H! }+ D- X. R# b) j, I
{
* V! |3 N, q# j3 n) J& @4 j% O: j* {  cout&lt;&lt;"the input.txt is not exist!";& E7 C  M1 l: J$ _, u
  exit(1);}
) N; w! I$ }5 t( I0 L3 n: h4 I int i=1;& u: U2 m8 h" \1 N  R
String s,t;
2 ?. y3 C, |0 \ s.ReadString();# i- D: y8 C" s/ g% ~
while(t.Rs()+1)2 f) [! C* i1 V* d
{4 m6 l+ Q; n2 e$ p) ?) E# w2 k
  i=s.Match(i,t);
2 n; e( }8 _* c4 E  o  if(!i)
' \8 J! d! e" d4 f" a% I. N  {1 B, s% `8 Z6 M
      out&lt;&lt;"No"&lt;&lt;endl;. [% O' U* n* G$ U7 S$ P
   break;& R9 Q  {; a: C  s) I% y2 E
  }
# F+ o  f) N* F4 q9 u6 c% a }
/ v- B, V' [: A& b if(i)
. l% v6 j- ]4 j' p7 o! L- I  out&lt;&lt;"Yes"&lt;&lt;endl;
7 W  [" q2 J0 S return 0;' \: H6 r3 \5 {2 t0 f
}

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

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

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

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

5

主题

3

听众

36

积分

升级  32.63%

该用户从未签到

新人进步奖

回复

使用道具 举报

sgnswb        

1

主题

3

听众

23

积分

升级  18.95%

该用户从未签到

新人进步奖

回复

使用道具 举报

ari0101        

0

主题

3

听众

23

积分

升级  18.95%

该用户从未签到

新人进步奖

回复

使用道具 举报

0

主题

3

听众

22

积分

升级  17.89%

该用户从未签到

新人进步奖

回复

使用道具 举报

0

主题

3

听众

72

积分

升级  70.53%

该用户从未签到

新人进步奖

回复

使用道具 举报

ottiou 实名认证       

16

主题

5

听众

849

积分

升级  62.25%

  • TA的每日心情

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

    [LV.7]常住居民III

    2013挑战赛参赛者

    新人进步奖

    群组开源分享

    群组数学专业考研加油站

    群组2013数模夏令营A题

    群组2013数模夏令营B题

    群组2013数模夏令营C题

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-4-19 15:43 , Processed in 0.512941 second(s), 90 queries .

    回顶部