QQ登录

只需要一步,快速开始

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

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

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

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P>
' E5 @! t2 i: ~# ~<>[
游客,如果您要查看本帖隐藏内容请回复
[/hide]</P>#include &lt;iostream&gt;
1 o6 _9 d2 e  [, U0 R: A#include &lt;fstream&gt;
+ ]8 r/ H8 p) @using namespace std;
) e3 g& |0 x  G* F6 Cifstream in("input.txt");
% H; h2 x8 Y3 bofstream out("output.txt");" f0 u& C' a: `1 e1 b8 J6 _3 r
class String, n# `. J5 n. g  B3 B, u4 K: M  s% B
{
, L" {! a6 Y1 M( c+ H) h, O9 i5 x  public:6 v/ m8 |( R& V; H! U
String(char *s="");  o  y* t/ o6 E# y( [. L$ U
String(const String&amp; s);
& M, T& Y" a0 @) C5 p0 ^ ~String();
0 `; N5 j; z  `& f6 B, R int Length() const;
7 V4 Q0 {5 x! ?* d int ReadString();. w( x/ D7 h$ N3 m% q
int Rs();
0 y5 o: G, A3 ^& D3 O" x& V void Prefix();
' _0 z5 W1 ^6 ?+ D6 G" O void ModifiedPrefix();
+ i, E) E4 l( t3 P! w( g int Match(int i,String&amp; t);: D# N2 W( l% v( h2 U
  private:' v& Q# y% g+ _% K" |" R. Y
   char *str;
. d/ Q$ T& S$ E3 O( ]   int *pre;
5 C, D5 w" j' k$ l   int size;
' f9 ?) I9 x6 b};
9 Q5 |; ~' y1 _$ d) e. `) j' o9 E$ WString::String(char *s)5 ^3 B) ?) t  I  Z, t7 H. b. T. Z
{
, {" g0 H  B4 ~/ L size=strlen(s)+1;8 v& e% X8 V$ {6 P7 v  m. s
str=new char[size];, F/ q7 ^; {7 G. L8 @3 Y; O; ~
if(str==0); p' s' Y  Z0 h* J# j8 r1 r
  throw "error";
1 [4 W+ a- N) G( U0 _8 }+ l strcpy(str,s);& H- Q" r) p; f- T3 G& m2 A
pre=new int[size];" M3 I& [1 X0 H) Q
if(pre==0)
( X  h! Q) C" [* y& `; u% r; X  throw "error";% M, s, Y& T# a2 M9 j( _
}
2 m1 b$ R2 c7 z+ I0 X) G! k7 HString::String(const String&amp; s)6 i! h5 w3 [7 X3 M( r6 `
{  z. Y* O( _& J. b/ c) @  o: R
size=s.size;
% R! Z( G2 H& U/ i4 q( ?" Y str=new char [size];
5 `% R- D" }* I! s% W if(str==0)4 S1 C* c2 b- ~3 L0 J  z; i
  throw "error";1 V) u' D* @6 v/ X
strcpy(str,s.str);* Z" G" K; S( I' r" f5 ~
pre=new int [size];; k2 `2 L' D$ E6 Z5 z
if(pre==0). ^* _6 r( o9 X0 b4 m6 T' e
  throw "error";( V. u0 Z& H) X4 T: N8 \; W. p; q
}
+ q' |/ K. ^+ vString::~String()& K2 b. Z+ [- B- O: }# B6 p
{
$ ~- t+ l8 N$ s( S* ]. V6 T delete [] str;
& ?  J7 @/ U# q$ O' f$ l( y; X+ O- L delete [] pre;8 _9 [( {: s- E! o) B/ `) P
}
+ [1 Y0 O, I% R9 _  kint String:ength() const5 z# ?6 K5 A. P2 v2 n# O
{
+ Z( `6 S! r- W return size-1;* `* O+ O- ^, [
}
7 T+ z/ `; f! ]* Dint String::ReadString()
! |3 i% M* o9 ~% V{
- G' L% p, M# u char tmp[256];
4 D, M9 S: l1 G) k; {' i    if(in&gt;&gt;tmp)9 m6 L) p' j4 M
{
0 i; |4 K( @5 ^7 }7 I2 W  delete [] str;
. o. {2 f* A: g+ P- Z$ c- @7 T  size=strlen(tmp)+1;2 a% R8 U6 F" O3 r% b3 A
  str=new char [size];# t* v7 y& a# [/ d2 b5 K
  strcpy(str,tmp);
! \4 ?( O: u. F% V8 X  return size-1;! m( }) C; D, E; C
}$ c2 ^. l" t& G. D! D1 |
else0 r* S& e! U! K3 C8 C- Y
  return -1;' K- |+ A. x1 g7 I
}
- F1 S9 t& I- j. }4 G. @( Fint String::Rs()/ `* y* j/ n3 s/ I4 S- m( m" |* _
{4 D  R) T& E# C7 V9 N; z
char tmp[256],c;
% {, q( `3 `, k3 {( A int i=0;+ h& a" W6 Y, W) W
while(in&gt;&gt;c)
- ]4 Q0 Z& p! ]6 d$ d: }) c {
- v( B+ l' n8 H  if(c!='*')
9 K/ I2 V" _% _  tmp[i++]=c;- ]/ ^- e  ~  c1 A, `' k
  else if(c=='*'&amp;&amp;i&gt;0)- F) r' g! l; m; V: t8 ?# i, D3 d
   break;  E9 H  u8 D( _, t3 u. F
}
  ^& t4 s1 A: B9 O; F' ~1 F0 `) @ if(i&gt;0)
. i0 `7 w3 |3 ~2 C' L5 _) V4 V  b {0 Q1 F" s3 x9 I1 p& H9 ~8 w
  delete [] str;0 S% d/ d# [5 z' e: B
  size=i+1;
# @% g4 V% G, G9 O# J4 J8 W# `- U  str=new char[size];
+ j1 |2 E2 `" E: }% T8 J8 W  if(str==0)
, E6 q" b5 i, S% i+ v9 k9 A   throw "error";
# a9 s/ J8 m/ p5 T9 S8 f  for(i=0;i&lt;size-1;i++); i/ }; b/ ?; ^. B
      str=tmp;  
# l' c- R. y) N& k  return size-1;1 Q3 P8 ^% _) P# T& R, }4 S
}  }; `. H: x& ~: n0 m
else
, }7 G% X6 e9 D/ R  return -1;
$ n, c, y5 k) o& c' G# H}
. X. l) }; ~) \8 N% Z2 ?! Ovoid String:refix()# k& `, m! b- B' Q7 A
{
. K. H% v% E. x6 H# c, X( g int m=Length();
8 ?" j$ l2 b4 _* m delete [] pre;2 b2 h$ e: ]' i
pre=new int [m+1];. Z; I* D. v: F. @- b8 d' h
pre[1]=0;- k$ ], U- d% j1 R- v0 [- u1 R+ D+ r
int k=0;
+ B  N( w0 r  Y4 T+ g8 e: F6 \ for(int i=2;i&lt;=m;i++)
; C3 `+ B3 C' Q+ | {
5 Q, k' Q; X3 J  while((*(str+i-1)!=*(str+k))&amp;&amp;(k&gt;0))
- x2 O$ G- ?! c0 \   k=pre[k];
: _: l) f  }6 S         if(*(str+i-1)==*(str+k)), b1 X3 ^0 C" y* z- C+ S0 y6 Y  }
    pre=++k;- M/ E: n& v3 Q8 G9 \+ v2 u
   else
( O4 d% f' O3 s1 z    pre=0;
* q9 R4 d+ m: c& H. G8 d+ T }
5 R) X1 K2 e4 R2 P}1 L* z6 ~3 n) J: d
void String::ModifiedPrefix()
: ]; s2 A$ y$ i, D{- s/ a% l1 |$ u( f! J% |
int *f;
2 F/ g( L; Y2 q6 v int m=Length();
7 p) t6 Y& ^( H! q! o% P0 H0 s1 | f=new int[m+1];, b$ j# y" C& n& I8 e  b
Prefix();
5 T* h; K, N  I6 q8 v for(int i=1;i&lt;=m;i++)
* _# u! i: W' \, J6 R4 P {) n. u, K/ y) h4 u+ l
    f=pre;
; Y+ C8 W6 r; F  y) j: B% m0 u }- }1 K- M1 d, P  K' t1 q9 d
for(i=1;i&lt;m;i++)
; \& L* A3 R$ Z, ~5 e# e3 J {" D) M2 ^1 |3 c: S% O
  int k=f;
; l" U( n  Q8 J: `  F( \, z+ a  if((k==0)||(*(str+i)!=*(str+k)))
" \" a2 m; K, k+ z/ M   pre=k;
  S# ^/ S; L; T1 C, B  else
$ L: Z# c  n* d2 q7 x( @( D  C   pre=pre[k];
& f5 p9 X, s4 ^2 \ }
0 w' m* z) L& g delete []f;9 L# V. _0 ]6 U* {) Z# C5 i) D
}
3 E0 t# I  p/ r: g% M5 Fint String::Match(int i,String&amp; t)
- B" ]. T2 C& s1 Q' V% D+ [2 |{) \! M( b; ^0 v3 W# H+ \9 L0 }
int j=0;& T/ d; v' G8 \0 N/ f
int n=Length(),m=t.Length();
7 I  l5 u) S( J7 c0 l, Y; S t.ModifiedPrefix();
" C; F; S2 A& H+ \: y5 `, s while((i&lt;=n)&amp;&amp;(j&lt;m))
- d0 a/ B; l& a- L6 @. W$ l4 d2 o  if(str[i-1]==t.str[j])
2 W. ?9 B0 S) q4 i. ]6 H' a  {
0 u5 s/ x" \. ^; i8 s, z3 o   i++;
2 ]% G5 S7 T( S  J; W3 u8 F' l) A   j++;
. e% N# q7 ^. M$ P/ F5 z% }$ C  }
. i+ K  x) F; d7 m  W& \  else
1 C  N& h. q! _. O3 \+ X' z   if(j==0)6 m9 s/ D7 j. `2 T" H, n8 `* k
        i++;
+ T" O0 K- k9 W4 v7 s      else ( Z2 Z0 W3 `" K! c5 o5 J
    j=t.pre[j];
: |* k5 a+ H4 z0 `  if(j&lt;m)$ F7 u  v/ s. j$ ]7 f0 a
   return 0;' g, w% d+ N) N$ P
  else 3 ^  b$ _$ u+ j% b
   return i-1;7 p% k* s+ P4 G! T' M
}
9 \* T$ b( E  Q3 Zint main()% X  Z' D/ F* G- o
{
0 R3 |: V/ b# h) @( T- e% h if(in.fail())
3 c+ s/ Z3 Y2 x8 J, I {9 J# [4 d1 j* J) k& Y/ `) U, Y4 |" \
  cout&lt;&lt;"the input.txt is not exist!";9 x! S: A6 c$ v  O6 v: X
  exit(1);}. z5 x- F5 Z3 u' o
int i=1;
+ _; k* k* |/ l% P) O/ s3 j String s,t;
6 w6 p1 J& L, c, D s.ReadString();
# B0 c: }1 L8 z5 c& d while(t.Rs()+1)
, p  k! s( F9 k8 B9 H# a {
5 L0 c; Y* E/ x6 ^  i=s.Match(i,t);- g, B6 Y7 X3 `& m/ D
  if(!i)
7 W3 ?1 U3 U+ x$ O; Z  {; o" z. k( C  m6 d5 ~
      out&lt;&lt;"No"&lt;&lt;endl;3 m0 _, y3 |9 |, a/ N8 P$ R1 V
   break;  m6 x+ U) a! l& ~
  }
6 D5 e8 H# M+ y! L }
4 |6 Z9 k- G! I; t& p if(i)
# O2 k7 e: ?, h1 J/ N' P  out&lt;&lt;"Yes"&lt;&lt;endl;  _, s* ~. G3 h# t9 u
return 0;
/ F  [9 p" `+ J  f1 B}

间隙字符串匹配问题(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-9-2 23:44 , Processed in 0.500376 second(s), 89 queries .

    回顶部