QQ登录

只需要一步,快速开始

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

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

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

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P># E9 B' @& ?) w, f' Y3 l& n
<>[
游客,如果您要查看本帖隐藏内容请回复
[/hide]</P>#include &lt;iostream&gt;; ?2 e2 R1 }- i; E
#include &lt;fstream&gt;
+ H' X/ e0 t# ]% \8 M7 Dusing namespace std;
/ H: ~: {( {$ d& J3 v3 \+ N: @ifstream in("input.txt");. u$ d2 J: h4 J* x1 |
ofstream out("output.txt");
8 q, K- y, e, v0 Pclass String' b5 `+ E; a2 {0 M7 L
{
3 n# `! V$ ~) P1 B0 l7 P  public:1 ^# R- [$ k! s" Y' U9 j5 L
String(char *s="");
- q# _/ P6 P8 x5 u9 ~$ O String(const String&amp; s);6 t  T9 D' @9 F- Z% P- `7 E5 f+ Y( p
~String();
5 S9 Y3 e+ v6 M! B0 m int Length() const;3 P9 Z4 ^6 r# t- ^+ U: D' d: j2 Q
int ReadString();
6 v6 y& ~% T! y/ V. M/ R, o% K int Rs();
# z) w) {5 [3 x+ } void Prefix();
% f1 Q' M% H6 ? void ModifiedPrefix();& |/ C5 U$ b1 ~3 n
int Match(int i,String&amp; t);
5 Y: U% f( Y. {3 v! J$ @  private:
4 }  u( H) ^; q1 h7 W   char *str;; ^' v% [. y1 m' {% t+ Z% G
   int *pre;8 Z& C1 T0 O. }" D/ K) [; M7 c
   int size;+ V% z( `# [4 q# V  g3 @
};2 X4 o' t( x, X6 |  @
String::String(char *s)
" b: `$ S) E  ^# y1 ^{
( z$ U5 Z- ^4 H1 ^. _1 O size=strlen(s)+1;
' d' e+ H0 [$ b str=new char[size];7 H2 n5 X' Y) D
if(str==0)
8 J# M/ i! t" S2 Y# _  throw "error";" Q9 q* \; o9 b
strcpy(str,s);
& Q" }. Y: P# k% ~9 [ pre=new int[size];
8 F) s5 k4 ~. N8 K: E, n0 A if(pre==0)' f3 ?, p: u* d8 @! C6 M
  throw "error";' H0 B. s5 I& t/ i: I8 p3 }8 D5 i
}8 k- z* K! @" U% I) I
String::String(const String&amp; s)
, K5 X* n5 l: P* U: _# e0 U4 a{
- X# F1 d$ U/ R+ k+ O$ y size=s.size;! z5 C. A6 W- m
str=new char [size];0 }5 A! y! b' A0 P( s) B
if(str==0)
4 l. o! d: ~) C: w2 ~0 N5 E$ k, B7 ^  throw "error";# Y0 K# [# h# x8 ?! i9 _: t
strcpy(str,s.str);
+ `) h: `4 {% N& T pre=new int [size];4 F4 z2 V6 i1 A0 `: E: Y% l& n. e
if(pre==0), a$ G' _7 q4 M' r( D5 |
  throw "error";, v' k1 q; K4 |8 N
}1 B; ]; Z+ b7 J  O
String::~String()  e! ~1 g- f" i* N, N  s# h: A( p
{
' A9 U* A2 E1 n2 G( l% G delete [] str;' k# o7 i" d1 b! U. ]9 D5 ?  b
delete [] pre;6 v$ T  e% A1 M8 r6 D
}
5 d9 ~9 [- J/ i- Uint String:ength() const. b& L4 d; d1 C4 x
{" H! S3 N. F; J) j+ b4 t( J
return size-1;9 r0 Y! A* D% L
}
- N9 p" ?$ E( G  Zint String::ReadString()
1 q4 z, g" j0 U{* u4 J: }/ {3 z; q
char tmp[256];1 d9 R, h: X. Z8 C
    if(in&gt;&gt;tmp)( U. |# w2 r( \
{
1 e: S1 E& k, n3 B. D0 ^  delete [] str;
! R3 R- c5 n5 n; B) V  size=strlen(tmp)+1;
+ w) p7 {8 N" W" l. m3 i$ m+ ?  str=new char [size];
. x; B; x4 E) g. K- `  strcpy(str,tmp);! ^! G, {. @: Q  s+ A; I; z5 [
  return size-1;$ |/ v) \( o5 C( P" O; h
}4 X1 Y6 w( G! T  g% F
else: ~6 Q/ W6 ]/ L  G
  return -1;
  F9 G) S% h# F  }! q}8 y% z  v7 b+ V
int String::Rs()
: ^8 l- n; ^3 z8 Z, J' ^{; ~, l' A8 `: X; S- S* w
char tmp[256],c;
7 V8 X& N0 ]3 [+ H& e int i=0;
2 ^. j4 F& ]$ m3 d& ^ while(in&gt;&gt;c)( V, V& W" }- \* n" T4 L9 z, z
{( ]; L" N8 g: f. D: `
  if(c!='*')
! N* s% k- B) V* |" L  tmp[i++]=c;
1 q3 l# U, d, ?! u  else if(c=='*'&amp;&amp;i&gt;0)& E, C- j' ?% B, o8 `: e" I
   break;) N8 x9 l+ ?/ S0 ?; s7 B' z! K
}
0 P# j" J8 Q: y6 ^ if(i&gt;0)
  u, u. @6 a3 F8 j4 u; [ {
2 |/ h1 R. V" v; v* @  delete [] str;
- P+ Y% R5 c5 o- x5 O  size=i+1;
+ P4 W% [7 }" x/ p  str=new char[size];4 o% O# g, U' F: x& m; o1 i
  if(str==0)
+ W& p  k% v. G# D5 H5 S   throw "error";. n. s& C: J# G$ G
  for(i=0;i&lt;size-1;i++)" i+ Y& r5 U0 ^& x- j, q
      str=tmp;  
6 n' ?  {8 ~/ I6 u) c- x  return size-1;- \. t* j4 ^' v8 K
}4 U. i& W( q! ?7 ]$ W7 T+ e& v# y( P
else
  I$ Y6 B( Y" f2 [- ?1 N8 O8 ~  return -1;' S- f; [5 X: [
}) x8 H# ]5 M# B" g) [
void String:refix()
7 o" T4 l( t& t+ x. t{' x" J, V# k: b
int m=Length();
9 T# Y9 B2 U/ i6 p; _ delete [] pre;
: f# C& j6 `- l- t( g/ w* y9 b pre=new int [m+1];" Q! W  E+ R' E0 I/ ^% D( r
pre[1]=0;, ]/ ?, m+ B6 Y" w
int k=0;
( J% M* }' ^5 l" v* m for(int i=2;i&lt;=m;i++)
  L+ ~9 M; l: ]2 i1 U {
# |. o  `5 H% ?* f  while((*(str+i-1)!=*(str+k))&amp;&amp;(k&gt;0))6 y  K4 t3 V: \
   k=pre[k];
7 T9 q$ Y# ~& N+ \$ k         if(*(str+i-1)==*(str+k))
$ s+ j2 c! {$ j' B    pre=++k;
7 N# E- @) N3 Q5 {   else, r- _) r. N* K6 {/ G: Y; }. j
    pre=0;! Z: F5 ?' X- v5 i, ?" q
}
% x, @' q. C! A/ ^7 e; q# i( m7 ^" t}- c3 n7 \' G# C; q
void String::ModifiedPrefix()
+ r- v. J% J; Z( h' h% Q- K{
5 F4 d9 S& u" |4 _% O1 {" z int *f;# R2 A. A' t- W- e2 q* H; Z5 v
int m=Length();0 P! n6 M) O; Q( @
f=new int[m+1];6 G& I  Y3 \% u
Prefix();3 Q/ ?  }  o$ ?) O- _; F7 j
for(int i=1;i&lt;=m;i++)) @- i" A: x4 q( M: p% S  k$ b
{
; S0 Q, M6 A0 [7 P# D    f=pre;1 u$ Q8 Y! W3 D9 m6 j/ S
}9 T5 b0 H( N: m9 V1 q7 I% {) n
for(i=1;i&lt;m;i++)
! S+ l0 C. ]" |/ i; c {
+ M5 `6 |3 q6 P- s1 d" t  int k=f;* D* \# q5 V. Y/ E1 V
  if((k==0)||(*(str+i)!=*(str+k)))1 C2 P/ v; O8 |' f& t% M: Y# v( M
   pre=k;! Y( j* v' a+ [1 ]
  else
( o( R3 q, D$ L/ P( T   pre=pre[k];" m" C  d, p( P6 ~5 R) y" x
}
! }. s) x" c' R9 H5 y delete []f;
. N& I  H  q5 j, x* c}
1 c) P) X$ p6 N  m+ @" @int String::Match(int i,String&amp; t)4 Q8 h: |; V" u* u
{8 ~* R1 X1 ?4 ^, u( X) B" X
int j=0;
) u( `- Y" ~, F4 F/ g& U int n=Length(),m=t.Length();3 O7 v0 S7 A1 Q" c+ D
t.ModifiedPrefix();
* W) H+ u# r& ^ while((i&lt;=n)&amp;&amp;(j&lt;m))! S2 C9 a3 e! J: Y% |( T3 L. z' O
  if(str[i-1]==t.str[j])1 v: l' @4 @+ C/ t
  {
3 s( K" e' U. u7 l6 i2 S   i++;& Z, Y& R) j% R0 Q2 r$ Y2 m
   j++;" y, Q+ @8 Z. \; R
  }/ a1 D1 @) g1 U
  else 8 u; f, \. K4 f9 b
   if(j==0)
% W, o; Q3 {+ T- ?$ w  a5 V( [        i++;, v9 K! H8 \* H# T
      else
; h; y6 {8 x/ Q3 H5 Z    j=t.pre[j];) X0 g3 C  a' ~. z# c* R" _3 e
  if(j&lt;m): |8 w- g. d0 \; ]
   return 0;% H" x$ w3 O7 f, m% C& K+ Y
  else
( e2 V5 Y! w0 \7 N   return i-1;
. p3 T; Y6 x. B$ G+ H0 Z4 c}
, e. m9 N$ v* Kint main()- T+ M7 Q0 D. O
{
2 e6 p1 i0 J" ^6 o( f6 s if(in.fail())) O- }* Z( T  K. K
{
2 J2 Z; s6 {& W4 B7 B( b1 p  p  cout&lt;&lt;"the input.txt is not exist!";
' L+ _( a: X* c% V  exit(1);}& h" h% }% h7 W. D0 I; ?2 U8 Q
int i=1;
; v2 n" @- c9 j- ?8 \+ n String s,t;" m, r/ w" d" l$ ^& \9 Q. q7 B$ G
s.ReadString();! D4 x5 j6 r" J" r5 H( T; L9 p% D
while(t.Rs()+1)# m9 }( R1 B! _9 k+ J8 i9 V; D
{
0 P' q! `7 D5 Z- ^. U5 ?$ @) M  i=s.Match(i,t);
4 T) [4 x2 }" P& z  if(!i); \1 z" I6 M& y: {- E  K
  {) u3 M, m; Q7 E. n! j& S0 [
      out&lt;&lt;"No"&lt;&lt;endl;. _, Q3 Q% z& Q# }( x
   break;$ W$ b3 F+ g. f" f+ x9 x" n2 w
  }
7 Q6 E5 c; ~* A! ?9 w) s3 f0 y }
+ c" S% D4 f0 e& [ if(i)# D/ X. a3 w: }4 s( ~) g
  out&lt;&lt;"Yes"&lt;&lt;endl;
9 Q! V# j8 P: [. u( F+ C0 b return 0;0 ^' h. z, q* A, X; K  q* y
}

间隙字符串匹配问题(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-4-20 02:19 , Processed in 0.511048 second(s), 90 queries .

    回顶部