QQ登录

只需要一步,快速开始

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

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

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

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P>
8 F" ]) ?( F( D! e( o) e. N  k" S<>[
游客,如果您要查看本帖隐藏内容请回复
[/hide]</P>#include &lt;iostream&gt;$ {5 U& @8 @# i# j, W6 z1 N; L0 a
#include &lt;fstream&gt;
+ X( ^! d+ C- p4 {' t: |& Cusing namespace std;
7 k& j' b3 k4 G& h+ Tifstream in("input.txt");
8 Y0 b- W7 G: \2 H0 Tofstream out("output.txt");
3 M4 D0 ~1 n  U9 F; i! R. Bclass String
) [1 D2 J0 z6 M! b* Q{
0 h/ o- h& F' T  public:
! ~+ Z( \. ]" \) x) e" f String(char *s="");
8 ?: g  T2 n" b$ U9 x0 h: d String(const String&amp; s);
6 p1 P6 F% r3 @9 a ~String();
8 r2 z  J9 o  _6 @: v/ b int Length() const;
5 B5 X) R" b. T8 W$ f, d int ReadString();0 }' T6 S1 U5 h
int Rs();
; U; \- `+ B) U3 T6 b$ L void Prefix();
) z" F/ C* j' D; U4 X& K4 @ void ModifiedPrefix();0 P/ `) Z3 M7 t: g: n' B& [
int Match(int i,String&amp; t);- R$ {9 u: j5 l5 |' H
  private:9 Y  ~6 ?9 A* _6 T/ d
   char *str;
0 p" U8 @& R  Q5 w, a   int *pre;
, r6 l/ C, E8 w, _6 [: U* X( C0 b   int size;# v9 X; D% P9 E; c: n5 J' m
};
$ O5 e) d+ H' J2 C% f0 j4 m; n; h7 nString::String(char *s)
0 A- }' ^' a# }: P{
$ T  I- u1 z* S0 _6 C6 @ size=strlen(s)+1;
  \  t6 A- _8 n4 y  x% z0 E str=new char[size];
9 i% K0 O" m6 \, G6 A* ] if(str==0); D+ {# c+ w  g- E7 ?4 s
  throw "error";" t7 b* E7 G* O2 Z
strcpy(str,s);0 p8 ~% e/ B- ]6 L- E1 p+ a
pre=new int[size];0 |3 t  R& q) ]' U: G& `
if(pre==0)
& m. y1 a5 i8 H5 q2 K* o& i% P; e  throw "error";8 u5 ?. X9 J! O3 Z/ V7 J/ X6 Z( k
}
) F; y  j  D+ h: i7 PString::String(const String&amp; s)7 t9 Z4 m. i* X  O9 ~- Q7 x
{
6 U( a) j! t6 _" n size=s.size;
# i2 P9 Z, T$ y/ Z$ R7 A str=new char [size];1 a& G- q& B. S: B1 c0 r4 y
if(str==0)0 I+ Q4 Y& H7 C: E
  throw "error";# |8 n) p. t7 J% L# P7 I
strcpy(str,s.str);
3 M; s8 _7 p! P9 X+ r3 u# w pre=new int [size];$ B9 e3 Q1 }# l9 {0 E. @
if(pre==0)# I6 o3 q9 [4 {0 P6 f0 f2 R
  throw "error";
, w: l. r) Y" U/ g( W4 [+ W}  W# r4 F( m. m, K8 ]% W
String::~String()
7 f* e% S% w8 c% i# t0 D{9 p2 ?; S& s: C6 K# j
delete [] str;
) |/ D7 H. Z* x& i8 | delete [] pre;( M8 ~$ I" j9 t! z& \' z4 A
}' }" G4 p7 m* P; H2 E! e2 `
int String:ength() const
4 T% e' h. l) d( _) I  k3 t$ U0 L{3 O' V& j, J+ n0 I3 p
return size-1;
4 g  q- \/ K) P* s9 G. S}; f$ _4 s6 G/ Y- H$ _4 o
int String::ReadString(), L$ ]$ t2 ?0 u1 ~. J
{
* B: M* W: U/ w2 } char tmp[256];
! g! U( o% a; W* c& X- |    if(in&gt;&gt;tmp)" h( r6 w0 N9 S4 C2 K4 i9 ~) a8 p9 v
{( p! x& l/ g! [
  delete [] str;# y# N1 o8 V: C  [; j; r
  size=strlen(tmp)+1;2 ]; `) g6 K/ m6 f
  str=new char [size];- ?+ F6 H' }% ]/ o- f- N& Z
  strcpy(str,tmp);( [% V- \; R1 `( ]6 k* N
  return size-1;8 o6 X; e+ x+ X" g5 {
}
# T3 C! E2 z2 K else1 L/ O# b; H3 N+ S: t$ z
  return -1;
8 n) V/ I* k9 u8 k1 a3 s' j}8 U# M& c) v; I5 I4 ?
int String::Rs()
  r  C# F' i# j2 q/ I5 x( G{
0 ^; g* s8 M3 ~. q' R7 ] char tmp[256],c;' k( G% P& a+ p$ @
int i=0;
, W) t! D- U- h' L) } while(in&gt;&gt;c)  U4 }& `. J7 Z, ~
{
% X, F/ l9 y* Q, F  if(c!='*')
% D" Z0 k! R2 v6 N: G" Z4 |  tmp[i++]=c;4 T" u0 Z# G# Y! T
  else if(c=='*'&amp;&amp;i&gt;0)
4 s% b# n# S! @, V$ t   break;4 r+ u! s  {. s
}3 g& s0 I  E! D9 M+ v9 M" @* h
if(i&gt;0)
9 E& s; F; e( w) Z7 B7 n; S7 L {
, B  x2 t) ]( X* u+ x" I+ ]% O  delete [] str;
1 q: S+ y$ T0 Z9 q' d  size=i+1;6 k( p. x( ~2 x0 V6 D3 `
  str=new char[size];$ c- }2 J# z7 E! L! ^$ s  R
  if(str==0)" l; [/ p! b1 e3 s( S
   throw "error";
( R0 {, L, ?5 o% t  J$ M  for(i=0;i&lt;size-1;i++)7 l, M, w  H0 T
      str=tmp;  
- ?" t: t& [& T$ s" P8 K" o2 r  return size-1;. c) E  x4 n6 Q
}
% _3 y+ g: V0 Y7 i1 {. g else
( [) L$ a& y) [$ M) |% L3 r0 Q% q  return -1;' I1 |5 D0 ^) f' Y: r0 {2 x
}2 D4 s3 P5 x5 y/ {  m4 e; j, `2 _9 i
void String:refix()8 Y, w2 U8 l! L# P7 o4 T: t
{2 _9 ~) }3 H$ ]+ R, X# P
int m=Length();
; y1 G3 G: I' |2 F& n4 |+ n delete [] pre;
, J7 _7 O: v( \/ Z1 ^6 L6 z pre=new int [m+1];
5 u) l; \. T; O3 E1 s pre[1]=0;
) b5 W5 \4 u  @ int k=0;
$ K- ?/ S; g5 E) b0 j for(int i=2;i&lt;=m;i++)
  a- I' Z0 v" b  s& q  g9 s {1 b- o0 P: h! ?
  while((*(str+i-1)!=*(str+k))&amp;&amp;(k&gt;0))0 b) B0 T3 `0 y/ I7 v$ w7 Z
   k=pre[k];
; j9 u& o1 t* b9 s         if(*(str+i-1)==*(str+k))$ w) d; o# ?$ \3 L
    pre=++k;
, V" z4 ?9 l% c0 h0 [& Y6 U0 l   else  W: w5 F, N( p& d' N5 d
    pre=0;9 Q* A8 A! [! E* X( l* {
}/ w  d. n) C8 Z! ]4 v# d7 Y
}
  _* v' q# ], ?void String::ModifiedPrefix()( D( ?5 c+ W6 r3 H/ o$ w
{# F0 k' i& Q8 I, V$ B9 j2 W
int *f;
+ f+ E" }% t' w& L8 y int m=Length();
- |0 Z- r. Q' l0 l- u2 Q f=new int[m+1];
: `# ^/ y5 p' X' [# f  ^: R Prefix();
2 g4 Q% x7 Y- B; e5 Z6 q. D" @ for(int i=1;i&lt;=m;i++)  X- E4 [$ ~8 @& |  j
{
- L0 s# K3 R! W; F    f=pre;
2 O( ^4 r! S4 L) S' N }8 c: ^6 H0 P6 q; ]4 w4 f$ e
for(i=1;i&lt;m;i++)
! ~7 E+ j" r( ^ {
% h0 u% G, r2 r. L  int k=f;
1 Z- N6 p% P- H5 S- b  if((k==0)||(*(str+i)!=*(str+k)))
* |! P* g! D9 i+ ]5 v   pre=k;# A( \1 n. f4 G' h
  else
7 a# A' l% c+ E, y7 c* V0 _6 x$ @* w9 P2 R( W   pre=pre[k];
: K8 e5 ~9 o. e; i }
' r! u, X0 x1 Z0 M1 {* | delete []f;
; ]# h+ K9 k" O1 T! c3 q}7 o5 ^; H% B! J# _# N. g* l: y& S
int String::Match(int i,String&amp; t)
* z( |7 m* m& C3 Y& K& t{
' J+ Z& l, x5 p4 H, [$ H int j=0;
4 G2 W* T$ B0 W8 j! s* ?. S' v int n=Length(),m=t.Length();* D0 S" P) F2 P: K4 `1 z" R4 x
t.ModifiedPrefix();
( F' Z3 a1 \: a  [ while((i&lt;=n)&amp;&amp;(j&lt;m)), u7 K- a* Y8 ~$ d3 s
  if(str[i-1]==t.str[j]), ]: P: x- L5 T$ b0 @
  {
: g# Z$ x3 G0 y! Y! H   i++;
5 q- ^) G/ v% s$ [( _   j++;
* n- h+ {/ G- @% R% @  }
6 C6 f( p' i4 ^  else ) c" r4 A5 u# J% w) V3 U
   if(j==0)
9 V% E% `2 h3 N3 A/ k        i++;% E/ Z, n! L/ y2 w% T8 |4 I
      else
3 m) ?6 }2 v  }2 p    j=t.pre[j];
. Y0 F, F2 Y8 k* W3 Y0 h2 ]  if(j&lt;m)
' d8 c/ R, `' X4 T, @' e# C   return 0;
' ^2 i; _$ j0 X" l& O, w  else
% q& Q$ ?2 }1 w, a   return i-1;6 o6 h7 O. o1 b+ W* b2 W
}5 ?7 Q. b7 o1 ?; n% `! y9 m
int main()
; z  m! a1 N( T  ^3 P  O# W/ V{1 {; }6 Y% I: N" f/ }, A
if(in.fail())
8 W! ~- `3 _9 G& T {
. D# e0 {$ k% M( z2 l2 Z7 [  cout&lt;&lt;"the input.txt is not exist!";  G8 H% X. j' K& _2 L; U! E
  exit(1);}
0 ^  ]! d- K7 Y% N7 l4 J7 K int i=1;  w( k9 N! O3 ^1 A
String s,t;! c% C5 G2 q8 [: D; t2 _4 u
s.ReadString();
# b) `" F9 d+ t- f6 e' F while(t.Rs()+1)
' U+ U+ N! c! \) h+ f0 i {
/ |( s" ~/ k' s( Y  i=s.Match(i,t);
* c- \/ [  t2 Y. [  if(!i)8 B% E  g7 i" C/ Q2 F
  {
1 F: h9 G2 r+ Q7 ~) n! |, l" b      out&lt;&lt;"No"&lt;&lt;endl;
( }* f4 Z0 V: B, v+ B) b   break;
& O! N# \7 y7 V  b4 o  }
9 V0 s0 a+ ~* h; E0 G }- f  ^+ I( c, M. z8 J# t/ k
if(i)6 ~" E0 u, @- N/ N0 h0 {
  out&lt;&lt;"Yes"&lt;&lt;endl;
; U' l2 ?# K' v, l# p. j/ _ return 0;; _5 Z3 ^3 Y& Z; x3 k
}

间隙字符串匹配问题(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-1 01:08 , Processed in 0.508058 second(s), 89 queries .

    回顶部