QQ登录

只需要一步,快速开始

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

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

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

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P>
9 i- _7 v& H% a7 `1 @3 a<>[
游客,如果您要查看本帖隐藏内容请回复
[/hide]</P>#include &lt;iostream&gt;& U) f6 b* y2 w7 H4 N) i
#include &lt;fstream&gt;
' g; p2 L3 B' \3 p; vusing namespace std;, L1 Z! ], O8 u+ Q+ N3 v, P1 Q
ifstream in("input.txt");, C: h. ~% o% S8 A6 z" V( `/ i9 K2 t) a
ofstream out("output.txt");
% k; w3 d& W5 |( vclass String( c& d9 a2 V3 O) i: _
{  u# m' f( J% M- b2 v4 ^; o* |
  public:0 u: t8 U3 E& j# k* w) Y, n
String(char *s="");5 _: T; K( X+ R6 c5 P2 x
String(const String&amp; s);
+ n# i/ l4 V, k- \) S( Z  R% ` ~String();
9 u  ~$ S( {0 \; y8 E! Q: J, A int Length() const;
5 Z+ T' y/ b' ~2 [: A; ~ int ReadString();8 O" T/ g# h0 M5 G: ~( H
int Rs();
: N# c" y" O' C# B void Prefix();3 y( w2 v0 H. P% N5 A2 h) [
void ModifiedPrefix();" G5 V2 o" q2 b' r& {
int Match(int i,String&amp; t);
6 R/ p+ X6 k) x3 ^% h  private:
# v. b8 ?& Z1 f- v   char *str;: c- |0 n6 B3 y$ G; A. G
   int *pre;0 u/ d- j. ~. a0 ?  Q
   int size;
! N# `- f( {, |& f6 V0 p* @};4 r) j5 S- e; g1 z# w
String::String(char *s)' o. R! @, m9 g3 ^) Z9 E
{4 [/ |9 A0 f- O: _: M. x; g
size=strlen(s)+1;5 _6 s5 M; Q; s& o) |$ t9 J
str=new char[size];
; Y$ C* Y$ o+ ~$ Q if(str==0)
& f* I! A! s$ X' u: ]" J# o  throw "error";# j+ i0 |; H8 D( f6 m" r
strcpy(str,s);
3 }$ |! e8 n9 `6 r( ^' t pre=new int[size];
! u6 n3 Q3 X5 ^ if(pre==0)
, Y: c: J1 h2 l0 a( L, r  throw "error";
/ o+ x! C2 m! J5 z+ Z$ ]( z- N}1 b) F, m, _2 [, [
String::String(const String&amp; s)
6 t& y" i+ X0 b. W" w' v* G- \" f{6 W5 \/ d7 E* d$ L1 D0 F" ]
size=s.size;0 S) I0 s# ^) @8 ~: L
str=new char [size];  V3 l& H5 N. Z6 G3 h; }
if(str==0)) l# p+ S% D( z' D
  throw "error";
3 z( E& A' N- i strcpy(str,s.str);
5 L6 G9 v: h* p$ `) o4 a: e pre=new int [size];
8 ?* f  A1 S# Z) B if(pre==0)
4 v7 J' m+ z8 o9 x' t' P  throw "error";
( z# [  j2 a: e+ b% O}1 q1 r8 o; p8 l. ~% Y- u
String::~String()! J+ C5 e7 c. x5 r
{' n4 M+ c; E+ @" M$ C% F8 Z
delete [] str;% _. w* B, T6 U) k2 G2 m$ g
delete [] pre;
2 j% Y$ L0 d4 L; o* z}& x6 \$ `0 H' ^9 B! i
int String:ength() const$ G+ c3 C# L( n" f, n; B4 A: s
{
, q$ l% I4 Q. H$ B return size-1;7 l" W9 L( p' x- z
}& n" ], M) U+ S# @% G
int String::ReadString()
9 d" g# v2 i! P2 T) R0 M{3 }! H  z9 _. A# B% X. n1 U0 ?1 [" q
char tmp[256];, t9 a& p8 g. u. ~) O
    if(in&gt;&gt;tmp)
% g+ I$ f/ S" D/ \1 C' d {
7 S: ^  z3 N  K% [  delete [] str;
+ p& _+ V. s0 s  size=strlen(tmp)+1;9 }  u; j- @" ~1 r1 b' w" ?+ P  Z
  str=new char [size];4 ?! |2 w% s, O7 f4 s
  strcpy(str,tmp);
; q/ u$ ?4 X, ]" M/ n  @' z  return size-1;
6 P; j$ X4 ^& w1 M6 [# v- b }& H+ d5 n" g3 @$ ^. g) A1 d1 ?
else
' W$ x" b+ ~/ Z( Q  return -1;
" T. X  a/ z7 m) ]3 K& S7 K}
! s, M: E  t, v: j) O6 x# w: nint String::Rs()! ^5 z( A4 y' A- w9 p
{
7 L/ ~8 d; Q! z+ z* e5 ^ char tmp[256],c;
7 z: ]+ d3 `$ Z/ E+ w  `/ N int i=0;
) K1 y1 S# |  O5 Q while(in&gt;&gt;c)
: @# d: Z8 F. p- G {" }( R# a/ h/ I2 ]0 N6 b
  if(c!='*')
3 q. p7 ]8 g# }: I7 b  tmp[i++]=c;
$ f6 P7 u- P% ^  else if(c=='*'&amp;&amp;i&gt;0)
* W4 E! c. N3 l5 G+ P  K6 w& P   break;" P- p5 l# h! Z
}7 |1 l3 m/ @: c! X5 E5 N% x) }$ h
if(i&gt;0)* _, b7 b) _* V. s5 y5 d& B5 ^
{
" s5 t3 M" R; y7 Y2 Z  delete [] str;0 a* Y" x% U! S4 y
  size=i+1;
4 p0 D2 c* \, L1 n  str=new char[size];$ U$ Y* B( @( X
  if(str==0)
" N4 W$ C' w: Q) O( j! w7 r9 g2 U' {- j   throw "error";! Z4 \  O( i9 b4 }1 y
  for(i=0;i&lt;size-1;i++): ?: V5 Q* |+ e0 u# T  s3 ~% a
      str=tmp;  
* n( |4 w8 T2 q* M/ u, C8 }3 Q0 u  return size-1;
; R) [, `7 m2 \* x }3 h) c0 S* N5 m/ O, Z; R5 b
else% N5 S$ N, t& \& J5 j, ]( G
  return -1;% v& ^7 p  H5 k, _( Z
}. W* u; p9 \( R/ a1 a
void String:refix()
* _; k! |2 D9 s& m{
8 u9 E4 V9 U- X' W- V( e& T int m=Length();
8 q* @  M5 G7 y delete [] pre;0 H7 {9 M! H+ {2 V1 t& I
pre=new int [m+1];% P7 i2 e' ~4 O3 |4 P1 }+ ^
pre[1]=0;% y2 _$ u9 E/ h2 g) a! k
int k=0;+ I% b% ^: V8 P
for(int i=2;i&lt;=m;i++)* X+ `; x( E5 }, W' a2 L8 b5 r- R9 z
{) u% k: t) o4 O! M8 h! |3 |* y' f9 e
  while((*(str+i-1)!=*(str+k))&amp;&amp;(k&gt;0))& z3 J( G* ]5 r  n5 n
   k=pre[k];
) y" ~1 f8 M1 t" T+ y         if(*(str+i-1)==*(str+k))5 r  S2 H, ?7 F
    pre=++k;
) E0 Y* u2 ~9 ^6 S; l. r8 W! p' p   else
/ T+ @' y$ d$ b8 z, R    pre=0;
- N, B$ G8 I$ u0 V }3 H% K, n( T3 d
}& N5 h1 r4 _8 |
void String::ModifiedPrefix()" K1 s( q7 {% g, {
{4 [9 R) W" `4 l+ q  P- s4 N( K# R2 U
int *f;
! L, ~; s' N9 q8 n# y$ }# s) S int m=Length();8 }3 l7 b5 ]4 m" T: h1 H: P& {
f=new int[m+1];
( r( K4 d5 C# U$ v7 Q Prefix();
! _, r& P3 B! `8 o4 H' B: N for(int i=1;i&lt;=m;i++)' u! u2 W) S2 {3 w3 M
{
; f6 c0 t- L* |2 E0 p" m    f=pre;
% P" k( D3 t  ]$ [; G }  v( T4 R, K4 }9 y) @
for(i=1;i&lt;m;i++)
  ~6 ?3 w+ E6 R/ B2 q {, W: S, V2 x2 u% W( C+ r
  int k=f;
  f8 }% c, H+ V% [; O* z  if((k==0)||(*(str+i)!=*(str+k)))
# r) ^/ w& w# `6 k  [; D. h4 I   pre=k;
; o8 J: u; U( P5 G  else 7 ^, u% g" N+ I# s( Z: c& X
   pre=pre[k];
! i! c  B4 o# e+ Y }& H4 {* N9 \2 u1 z- J
delete []f;1 E3 I& q: n* d- E2 z
}( }$ O$ q$ E6 M1 M0 }
int String::Match(int i,String&amp; t)
; w5 q4 A1 |3 @# }  W( f% |3 h- O* A{
/ v6 l1 H9 @4 q. _ int j=0;
+ u3 l9 m# `  l9 R. N8 r9 g int n=Length(),m=t.Length();3 }& I+ o' U3 C( H/ q2 L8 T5 m
t.ModifiedPrefix();
: o: X  \" B- k! d% G2 c' b while((i&lt;=n)&amp;&amp;(j&lt;m))
. q; P. r: j/ X  o5 ]  if(str[i-1]==t.str[j])
2 E& ?4 M% V8 r& u0 Q8 G, p  {
$ e7 n4 z, f! `3 D   i++;
; f0 \/ p5 c8 F  w' [1 L   j++;
1 o8 s' _4 D, |4 F, B" q3 r* M% K/ C  }
, `1 S! w* Z& ^0 K  else " }. Y5 [+ K8 X: K7 {& n1 ^
   if(j==0)5 y2 ^- D) R" e  c2 K
        i++;
: R) I/ c- B1 o! Q+ b      else
$ g1 y$ W, q" z; x) d! b; P- |2 x7 E! M    j=t.pre[j];( R; }7 {* }' @/ S9 L
  if(j&lt;m)
' }/ M7 r8 Y$ V% `3 n   return 0;: u' P6 V; a* C% I( e6 L
  else
  [) v% a, C% Z" E% v   return i-1;1 t/ W7 p, O5 V+ P! ]( \
}
. l* G) O" E1 i5 j/ Pint main()
/ A( J. @1 l3 g0 n{! ~" s$ d& ]- _" c' i% }. T' d
if(in.fail())1 S+ a0 w8 s( P+ g
{
* l& s( u# }' y; \; k( ~& c7 p9 W  cout&lt;&lt;"the input.txt is not exist!";
; R4 d2 t! z$ h  exit(1);}- f- k( S/ r5 X$ s! D+ T4 r* I
int i=1;
% e1 V  [0 ]: d, w: `8 w, I String s,t;) C6 M$ ^# b" J+ X0 C
s.ReadString();4 a" T9 W% U. U3 Z) x& f  P7 c$ A8 N
while(t.Rs()+1)
2 r2 \6 j) Q8 }1 v3 G {
0 ]1 Q. ]. i' d1 l' J: R8 n' x  i=s.Match(i,t);$ E" i/ E. W6 W
  if(!i)
1 e% t4 z) I* [: o8 b# L' E! `. G  {& d( [+ O3 r9 ~  P  F
      out&lt;&lt;"No"&lt;&lt;endl;
3 x8 D7 @) a; N; T2 M2 T; E, S+ M$ ?% @   break;+ R8 @+ u/ R  N" c
  }
$ v: e8 X( v. y- e& x }
8 U& w1 K$ r5 ^5 t9 h if(i)
0 H$ w# q$ E+ l/ Q  out&lt;&lt;"Yes"&lt;&lt;endl;
) q* c3 H0 u- n2 O& k* q5 L- { return 0;% @  y' L$ F$ e5 V# s4 y" P
}

间隙字符串匹配问题(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, 2025-8-5 18:46 , Processed in 0.804507 second(s), 89 queries .

    回顶部