QQ登录

只需要一步,快速开始

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

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

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

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P>
3 c  J; U9 {2 ~" j<>[
游客,如果您要查看本帖隐藏内容请回复
[/hide]</P>#include &lt;iostream&gt;" F) T; I) q7 {. ~
#include &lt;fstream&gt;4 a: ]- V3 V9 N! C
using namespace std;. D, Y( l; r  |. P
ifstream in("input.txt");
  ?* _0 n1 `- o. u. B3 nofstream out("output.txt");
, e  f: D6 [, _$ A& ^class String
! H/ T- x! R! J: d9 W, ~5 E3 M6 X& u{
. a' A. d* B8 a; _  public:* p, r, R5 t4 L$ ^7 L
String(char *s="");
4 z, H  I. F3 l  N( a/ d& d9 Q String(const String&amp; s);
, w8 h& I3 k7 @: i2 Z: A ~String();5 L* t% e. A! i* m! k
int Length() const;
& `: I: f# R$ u int ReadString();
3 B& Q1 a2 X5 r8 @6 w; a int Rs();+ s' u! b" U# `
void Prefix();- Q3 F' X# s$ W
void ModifiedPrefix();1 f5 u# D2 B- M0 I
int Match(int i,String&amp; t);/ E/ j% ]0 |/ c% z! @4 ]
  private:' e0 Y+ ]! O! g& P, ]6 I: R* ~
   char *str;
6 z4 c7 g% y9 F   int *pre;' a8 o5 Q6 l/ Y% h  X
   int size;
( D# ]( g, |0 Q2 ^; R};9 t, J' K6 T  Q/ ]! I. u
String::String(char *s)
# h0 z9 \" b4 d' p; h+ G{) Y7 t# n: G4 a3 E4 g: V4 W+ B$ C4 u
size=strlen(s)+1;- E2 E8 u8 x5 N' n/ U3 O
str=new char[size];
. C: h* ?7 h; n# ^; {1 e if(str==0)+ @2 l- c) T3 d5 [! u
  throw "error";5 ~' I* r: T$ N+ P7 }+ z& Z3 p
strcpy(str,s);8 I+ ~3 m! F0 K6 j0 [# d! f" F' z
pre=new int[size];
3 P5 N9 r# S& d; K, }6 M  M: F& ~ if(pre==0)
2 [& M. v# U8 G$ h" ?, D  throw "error";
+ U+ x/ t6 ]; i7 f* C4 d& z% \}7 l# J& n, H6 t
String::String(const String&amp; s)
: `5 u) @- @! r{) B; V: S/ z1 r, X
size=s.size;
# m: H' W6 R$ }2 x str=new char [size];
& B; @8 k8 D) Q  f+ G) I# y if(str==0)
9 \2 ], R8 T2 _6 U' y  throw "error";2 ], `5 ?& U; l# o% F6 C& P% ~
strcpy(str,s.str);
! m1 ~1 T; ~& J: n pre=new int [size];
6 O. }/ @% P2 Y if(pre==0)* ]4 P+ L# s& e! }3 g4 \: X
  throw "error";% P. j7 |9 ~0 t; H; O* W
}
6 o( Z- y* L0 _7 N# a& x2 KString::~String()
0 \$ _' g6 k5 ~$ z7 \7 E, w{$ S1 H/ ~, A9 t6 h2 [0 U+ p+ r
delete [] str;& t! M( Q: y3 W% E* v7 M; I8 I
delete [] pre;9 {6 {. r: m) }1 b- P& B! _
}
7 ~' R! m6 ~" E, p. k+ ~0 tint String:ength() const4 @" z3 i5 ~3 K
{
$ s/ k# f* `# l& _4 U% B return size-1;
, V9 J$ X2 x) j/ Y" m. E}
! ~9 A/ Q1 b" N& dint String::ReadString()
! Q' i! j: A% }5 `{+ }$ }5 B" M3 G* i9 D) I: E6 e
char tmp[256];
8 f# w1 N+ L$ H2 r6 {- j" [    if(in&gt;&gt;tmp)4 G. g! M+ e8 @) T; n! @
{8 X. |3 F6 I7 g9 ^
  delete [] str;
0 S$ n; V, R$ X/ G: N1 M8 U6 \  size=strlen(tmp)+1;7 b- j2 Z8 P) R, F( J+ A
  str=new char [size];
# ?8 t. x* `- o6 ]3 k0 G- u% o  strcpy(str,tmp);
' z! R9 A1 k4 @8 ?+ i  return size-1;( @5 G2 _1 M5 U; K. z
}
  H+ e2 L" N- }" m& D' M else! m3 ?& F. }0 b  m; x
  return -1;
; k/ o( P6 b, o5 }% X9 C}7 `# c! v: s1 I6 ]3 p' n
int String::Rs()
1 B8 ?  h) z4 ]+ M. X# F, y9 k{% i* i# G2 V! i! f7 `
char tmp[256],c;
  _/ v3 k; j. N6 r int i=0;
0 e  G0 `3 w7 x3 W+ L while(in&gt;&gt;c)( ^* _% b% }9 `* b3 P( U
{1 K. F7 ^: z+ a+ {- U6 {2 j
  if(c!='*')+ [8 u7 x6 N) @) J# r7 K- O1 u2 H
  tmp[i++]=c;
1 O8 s2 b4 I7 T7 e  w/ u  else if(c=='*'&amp;&amp;i&gt;0)' d4 X1 z5 s+ I
   break;6 R& G3 X0 o1 M1 B, A" Z4 i: N! L
}$ W0 g8 ~' M7 t! D
if(i&gt;0)
9 O" m& O9 @/ S$ U; x {) f" D* K6 F3 [% T. k. l8 r
  delete [] str;" b% V( j# T# J
  size=i+1;* d5 O5 o& [( F/ O7 L; ?' i( A( N
  str=new char[size];+ U2 f+ H4 Q( C  _( Q" @
  if(str==0)
. x, s- G' w: u! F2 w- S   throw "error";- d6 n# b" d5 H, a
  for(i=0;i&lt;size-1;i++)9 T' _( l1 I& v' b' ~& j  D
      str=tmp;  
4 f9 u% E) {1 W: d3 E  return size-1;
) Z* l8 u* O5 f. `& f% X5 @ }+ \/ ^% n* C" I7 [9 D
else# D! ^3 h; y( w9 t6 ~
  return -1;
7 ]& N" o8 v4 c2 c3 d& i# X}
8 g7 L$ \3 u2 ~! Y4 ^# a: E! Fvoid String:refix()
1 N$ \0 c; _" M4 K: T, p% O! D{/ g0 x; |6 ]5 D/ D: @
int m=Length();5 S1 u/ F, ~7 ?: j" z5 U$ f
delete [] pre;
' }+ w3 Y3 L1 j  `" a pre=new int [m+1];. {1 q+ b6 t. ~7 p6 Z- v% L
pre[1]=0;  [) t3 I. b3 D4 t
int k=0;8 y% c4 h3 A* R8 `' ^2 n* ?
for(int i=2;i&lt;=m;i++)
* j) W  u7 r* N {: N/ y. H) k4 S2 E! i( T% T
  while((*(str+i-1)!=*(str+k))&amp;&amp;(k&gt;0))/ E$ r* e4 a( @+ x1 {# x
   k=pre[k];
/ R- D% j# i5 O  n. _7 K# g         if(*(str+i-1)==*(str+k))3 L& D3 ]+ B% L
    pre=++k;5 {3 @8 q  [% D9 p. j
   else% ]( E0 ?2 P2 Y- X
    pre=0;" F7 y: M4 Z- K  n) i
}) w2 Q* _: y! C% ?3 ^+ Q! x0 z
}5 d' B  ~9 j) m( i. c
void String::ModifiedPrefix()
& ~' }0 Z" F4 D' d& S* d{
' {5 u* Q( Z% a* o int *f;
  o" a2 V0 n9 i: j' k int m=Length();
( G, c3 A! s4 b f=new int[m+1];9 b4 ~0 @, f! z( l
Prefix();2 p7 }) s* I8 G& w2 m- G. S
for(int i=1;i&lt;=m;i++)
! F% x: A+ p% G( j  N: A4 [ {
* @! e, w/ E9 X$ W+ g) Y$ j# o9 M    f=pre;
6 H) H) U1 t' |( X" C }1 w7 |$ ]: M' Y$ L" a% W4 p
for(i=1;i&lt;m;i++)
( t( p1 ]. |/ M {9 u4 B+ \( b1 Q) d- H9 C3 R: z
  int k=f;& {0 m; ]) ?: E# c. s
  if((k==0)||(*(str+i)!=*(str+k)))
# X+ M) W- y! K; O   pre=k;$ C$ D# W: d8 A! r6 }
  else
! R. s% s9 m# k" z   pre=pre[k];
2 Y- D. \' a" n5 r }
$ E! x1 q/ i  s- b delete []f;
% Y4 k$ U6 G3 F6 v7 e+ o}
2 x& b: z( p6 a6 cint String::Match(int i,String&amp; t)
) o( ?$ W, {% e4 k; R4 H: Y{
- N: y5 V+ x* X+ [# u6 V! x0 K int j=0;
  {. F0 Y6 [8 x3 h3 a; u1 q int n=Length(),m=t.Length();& U9 J) U$ E. S6 y5 |7 j
t.ModifiedPrefix();
$ @( l/ l" `# \6 L. S while((i&lt;=n)&amp;&amp;(j&lt;m)), M# ~( }% v8 v1 A/ {) a  d; Z! u
  if(str[i-1]==t.str[j])3 y2 W: I: _+ i+ B2 K' v3 {
  {5 z) _1 ?  I* d8 @9 J$ ~$ E
   i++;
/ e" r" Z" M# s" f( e( H   j++;
" @" M+ S' F& M9 {% B) s, t  }
$ u, g: n9 t/ p# T, ^* v% H  else
1 o" G" d# W4 ^$ l   if(j==0)6 n0 P! L& ~- ]  [2 B( G' @* x6 Y
        i++;9 C8 s! q- `; G' m8 }' I
      else ! ^6 H% {7 a9 h+ g
    j=t.pre[j];
/ @# R3 L, t* e' N( }: Z* t  if(j&lt;m)
. t& {- l- c; O1 h   return 0;$ D2 N' n* j- _$ Z+ v4 t
  else
7 y) g+ G* r1 A% s- e( d: Z5 ^" D   return i-1;" R3 D, j8 S# Y7 e# y+ ^
}1 R3 V1 T9 R8 ^% `1 j: [% j5 v
int main()8 G/ L5 b1 H; [8 r/ o1 R- Z
{! f- g( p$ ^6 V2 a; a) A0 b; z; B7 K& n
if(in.fail())8 K& I3 l, D3 C/ t7 N
{
: o( e4 j# ~# |  d8 a$ w7 u# w  cout&lt;&lt;"the input.txt is not exist!";
& a+ K. k& w- \  exit(1);}: Y9 D+ p6 L- C* c3 G9 w
int i=1;: C, e: H: j$ \# Z
String s,t;9 C1 F: B4 g6 t( I( L7 v3 }
s.ReadString();8 i* b$ v0 D4 ^3 R9 i% I
while(t.Rs()+1)
0 A3 q- P* A- S7 k) A {: A+ G/ ]- A0 x2 h1 `/ _
  i=s.Match(i,t);
+ W) N  ]$ \. h* ~1 ?  if(!i)) C: j! k; N3 b( ]+ q0 `( \: m
  {
8 l. z; P' G. k( p  O      out&lt;&lt;"No"&lt;&lt;endl;
- c- R! N5 c' {2 N: w, o   break;7 d, k) D# ^# a0 [3 g
  }7 {5 s( ^" q) T' s% b
}
" k' o6 T. B2 N, I: A- L2 d if(i)
5 G; ]$ Q* f' y2 g" q2 S8 J9 h9 D' [" Q  out&lt;&lt;"Yes"&lt;&lt;endl;$ {  [7 _8 I: l; C8 c. A; b
return 0;
. j5 P) H6 z3 d/ v0 y& A}

间隙字符串匹配问题(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-6-10 15:58 , Processed in 0.505707 second(s), 90 queries .

    回顶部