QQ登录

只需要一步,快速开始

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

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

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

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P>
% O* u6 J, `) L( L3 A<>[
游客,如果您要查看本帖隐藏内容请回复
[/hide]</P>#include &lt;iostream&gt;
! y- x% P# e9 W  @3 K  |#include &lt;fstream&gt;
7 g: K  J  F! A6 Eusing namespace std;. u# ~3 V$ i  [2 x# j  d
ifstream in("input.txt");$ r+ z6 M. P& Q$ r1 u9 l
ofstream out("output.txt");/ y/ @$ ^. u+ A% Y7 n+ E+ w/ W' u
class String; `% J$ Q+ f- v9 G1 O. i0 h
{
. [1 i1 W8 Z# ^  public:
: C9 s" \& H5 p. y6 U String(char *s="");
' |# C; a' N! \4 H$ X0 E6 S" O2 K  w String(const String&amp; s);
7 p$ A) M7 |* V ~String();! _/ ~2 j( P0 I9 a; U
int Length() const;
5 H4 v" i. q2 K: D2 G0 h$ k4 s int ReadString();6 J- z4 p; @) [$ N( z
int Rs();  L7 h* O# @( o$ Q
void Prefix();* e, C! u, \9 S7 |5 t, J) I
void ModifiedPrefix();
  ~- C% s& Y1 B int Match(int i,String&amp; t);
+ W# u- o( K( V! I9 Y  private:
6 M0 }% Q" ?0 h0 x1 ]$ _  m   char *str;) ^; {* U3 s' v8 w! i: L
   int *pre;
2 `; z' [$ z# L6 g' o1 A   int size;
/ e  n$ c- E. C5 K};0 n+ g. I! `7 D& l' ~* Y
String::String(char *s)
, _, g) z8 _# f) Y9 u. F{1 p! ^8 P& ~$ T; y2 ?
size=strlen(s)+1;
0 m( W5 B' J/ r3 V% @- Z str=new char[size];# J  R4 d& j9 O& m
if(str==0); J; u# ~, x; C6 N0 t9 T) A' [- j
  throw "error";
2 M! h0 a; L! h. ?4 y4 n' o7 i strcpy(str,s);/ G* v8 G( J& D0 d
pre=new int[size];* Q5 g- M, @  x; w5 g4 `4 ?7 p
if(pre==0), F, M8 z3 |  v! a
  throw "error";+ i0 v: i( ^4 Y
}
7 K: K! N4 t# z. ^( O- HString::String(const String&amp; s)
% ]( |' x5 c8 o, K, m6 i{; b4 y  I! O+ W6 J8 t" {
size=s.size;
9 H! x& }+ K$ O/ ]$ P% t5 Q str=new char [size];9 S" ~0 j+ _+ S/ [, a8 U+ X
if(str==0)) `3 F& F) C# g  `+ `
  throw "error";
( U) u( }* t% \0 `1 l strcpy(str,s.str);
) B5 F. w* |7 B pre=new int [size];2 u4 Y2 ]- j3 f+ h- `% G! R
if(pre==0)1 G  X6 x+ r! i/ W
  throw "error";
8 Y, S. s% h, f) t* X}" q, N4 G; G8 @3 J6 q" A7 d
String::~String()
  Y8 h3 `! e8 @. N% s{# A% z1 q  u2 j. y% \
delete [] str;$ a, }3 R; E7 }' j$ i, n
delete [] pre;5 S: |% {2 W' g/ h7 h
}
9 f7 R9 H3 \2 T; `; Oint String:ength() const
' ?. t1 b; e! I- q" }{
7 K  }3 S" {& \! F; w return size-1;
! w! s7 ~. v2 A5 m6 a) M}
5 @7 E) X* Z; W% lint String::ReadString()$ f( D6 ?! @7 i* X: z3 o" H
{0 f+ p1 v# C/ p7 O+ Z6 c. Q( `
char tmp[256];
% k2 Y1 A1 |: ?! d* h. j& I    if(in&gt;&gt;tmp)0 G; d' [2 f- |; o4 }9 }' Y
{, q( l6 ~0 Q% O+ t& i' \% F1 p* S+ R
  delete [] str;
; E4 e! n0 M8 w  size=strlen(tmp)+1;% H) d% R- [- M0 s( C0 ^
  str=new char [size];7 z$ l7 B9 k2 M' K. F* w& }
  strcpy(str,tmp);
$ {1 t; H# T/ I& m1 h' O2 ]  return size-1;
" |0 K$ s* X% R1 Q: Y! ? }
" p5 Z7 v4 q6 }, ~5 N$ P else
% `6 O0 k* n. f# p% ^( \  return -1;
' Y$ R: ~! |- w' ^5 ?0 k}
2 b8 d; R3 I+ `+ z+ qint String::Rs()8 |. R+ }! _. U! a2 G" S. S3 `. r8 s
{3 B0 @4 H6 [- i3 T, f7 _3 Z
char tmp[256],c;
/ l" _$ F& N/ U7 T/ w3 n, r int i=0;
9 A1 O# h. q/ R8 d; U( [ while(in&gt;&gt;c)
* _0 t! B/ E. A' f7 ?( N5 m$ i {) _0 Q$ `" L' @# R, X- E
  if(c!='*')5 Y& X1 R8 X8 S9 \" O+ x
  tmp[i++]=c;
" U: P$ ^1 m  s1 e9 A; s; `- _  else if(c=='*'&amp;&amp;i&gt;0)
9 N" h1 |! s6 ?8 H0 o7 ]   break;
# ~( l* y% F$ U, U: ^  @; m  Q }
5 p. u1 ~: E9 J( X9 ^- ?' D. r if(i&gt;0)8 ^# w  h9 H# G7 x$ l0 `% `
{
" e6 o4 P& _/ g3 X7 e! G' Y  delete [] str;
1 A# Y' ~/ M, m+ J9 `, }3 s! f  size=i+1;
5 B) q5 _% p2 [& u3 P' z  str=new char[size];8 [# v+ I$ d5 ?+ _6 ], h
  if(str==0)' d! h# G3 w! l. ?" Z9 |
   throw "error";) k# I  P1 T; |  f& @
  for(i=0;i&lt;size-1;i++)
: l* F8 p0 m. t" H% x      str=tmp;  
+ C8 f2 o- T( \) B8 x  [  return size-1;
" u% `  Z" ^' F( m4 } }; `1 R! j/ m" y  W2 k  }
else
4 b, d5 H! M' _" `$ B  return -1;" S4 f: d; B# K8 S
}
3 Y+ y) X% S6 c9 K) `void String:refix()
' M* d' E% z- B5 D) r; L{
; G( j5 h9 n, x4 m# X/ g3 C' W int m=Length();
5 W# J1 Q2 ~7 |" L, j: Z delete [] pre;
* p1 `: Y2 ~$ v$ w) p+ R2 i pre=new int [m+1];
6 P/ A7 h6 J& D* z1 k. o pre[1]=0;
4 n& @% T! T) g" a" V5 h+ @ int k=0;
& [! I, q' Y- Y1 n& |, o( D for(int i=2;i&lt;=m;i++)
' X  I: A- J, |8 E {
6 q( t% I% m) \: p  while((*(str+i-1)!=*(str+k))&amp;&amp;(k&gt;0))
$ U! W( c" t$ y3 I. G   k=pre[k];
* W( l# P4 a* X6 t- k% {         if(*(str+i-1)==*(str+k))
4 I" Y9 w4 I% G    pre=++k;9 V/ @; P6 x+ P" f+ Y2 S2 }$ R/ g; M
   else
' k% ^- _* u) U6 s    pre=0;1 W) R) u$ a+ C+ c" Y* W
}6 Y. N- y  }: T% N, d
}% S8 N5 Y+ s$ X# Z2 @* b
void String::ModifiedPrefix()
' H3 B: |5 Y. f{$ N7 h5 c; ^! O7 N# `! Q/ }7 W5 {
int *f;% B  e1 S  |* ]/ i! S
int m=Length();3 h  q! D2 A9 f- z
f=new int[m+1];
" ~8 A5 c- L5 ~0 B: Z Prefix();
: w; Y2 z% Q0 i  U" L& y for(int i=1;i&lt;=m;i++)
, L1 J' j& W5 _ {
" O6 H- G3 M; V    f=pre;
- u+ P' B! u' W4 w }
% b8 Y+ @6 r; Q0 X% _, X( F for(i=1;i&lt;m;i++)
5 y2 k* d! c0 P. Q0 z8 b, n {
- J: {$ v( f5 \' d+ K" C5 e6 W1 X+ g  int k=f;1 l1 x2 X6 `4 o, G* {4 Y( R2 J
  if((k==0)||(*(str+i)!=*(str+k)))! {/ I  s- l% H! E7 n6 f3 C
   pre=k;4 y2 L- J# x% F1 j
  else
; C! m% y$ h: b  E3 I   pre=pre[k];% B6 m5 `* \+ o5 B& ~
}# e% l$ V  I+ j* Z/ n, W, C; _0 N
delete []f;& i0 |% R% X+ j4 E" T9 r
}
2 J) x: U# _# U. n- cint String::Match(int i,String&amp; t)
2 \. w7 h; c/ w, }, M) w1 M: Z{
  _: {0 h/ a" l) T9 D' S int j=0;
* K9 l6 p! Z' ^6 S( I7 V int n=Length(),m=t.Length();9 s# y' S2 j) z; i0 z
t.ModifiedPrefix();
+ f4 l  d& S6 h: W while((i&lt;=n)&amp;&amp;(j&lt;m))
0 j+ }! X9 B+ Z% X8 }( ]  if(str[i-1]==t.str[j])6 |& u1 d# t, A6 ?% o: M
  {
8 P" E+ B, e8 L   i++;
7 T2 ~" S6 L& v/ [( q   j++;# y3 r  K5 K' K7 f/ U: [* l
  }/ L. D1 @8 \: L1 B% K" o
  else
: _' [+ K9 m, B. S: f& Q2 l   if(j==0)8 ]2 A8 n  D: l2 m8 N( G$ `+ g
        i++;$ z) N8 ]! @2 k6 p% P
      else
" O6 C  p% `7 h% p1 l% w/ ^3 l. F    j=t.pre[j];+ t$ @/ X, m* \/ y
  if(j&lt;m)
$ I* o. c& }. }# u( o   return 0;
8 m% G. f; s: Z5 a  else 2 W) B! s6 e0 r8 Y7 i1 F
   return i-1;
  g) C& G: I* ]8 F( o}
" C# U( J  _1 K' q+ Oint main()4 f6 l* }& |5 F8 X1 I+ t& E
{
7 O0 A! |4 g' I0 B( w1 s. m" [ if(in.fail())4 r3 z1 {% K$ k1 n. K0 p% ^
{; h* l. t& z3 ~% m
  cout&lt;&lt;"the input.txt is not exist!";1 r6 U8 H& r' V- a$ L- t
  exit(1);}
/ [+ S- \$ R9 G3 r int i=1;4 {0 h8 Y0 \# \" `
String s,t;
* e) D. g" [' l. b" D2 o' n9 N s.ReadString();
( U0 n4 k% t( R5 F while(t.Rs()+1)! i2 W- k; E. @$ F$ Z1 G( Q8 o; Y
{& _+ Q; {1 ~3 M! ~6 y
  i=s.Match(i,t);
! }& s% }# X  |7 C( Q  if(!i)
8 R7 A5 ^$ K3 u/ H( Z- R  {. s6 r+ s4 X3 p
      out&lt;&lt;"No"&lt;&lt;endl;
9 ]' A+ s" L1 I. i, \! G3 H   break;8 V2 p5 I: }8 {0 z# o: n& f1 R
  }
  d; ?0 i: ?1 T' N" Z% H6 U }! n5 B1 z( q; H+ Y: h1 p
if(i)+ M% q8 i; E. b6 |2 F
  out&lt;&lt;"Yes"&lt;&lt;endl;
; T& V  O( H& Q4 g! ]) p return 0;
# {5 f( W' u6 U  \, w}

间隙字符串匹配问题(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 22:37 , Processed in 0.770281 second(s), 90 queries .

    回顶部