QQ登录

只需要一步,快速开始

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

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

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

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P>
$ c# r' s. N$ n( H0 r' m<>[
游客,如果您要查看本帖隐藏内容请回复
[/hide]</P>#include &lt;iostream&gt;& `$ G$ H! K7 Z( c& U) _
#include &lt;fstream&gt;
. C/ g7 ~' E4 A$ I+ busing namespace std;# v! {4 K: J4 T$ ]
ifstream in("input.txt");% e* |' g1 Z5 r9 ]2 V
ofstream out("output.txt");% E) q, O! W4 J2 i# _7 X0 i
class String" d  H$ M1 k; K9 O& m# E
{( E2 W1 T' B- y7 S7 v8 F: ?7 |
  public:
: }  [3 r3 m4 H5 S String(char *s="");
5 C; x/ k  P2 |1 n  W8 r, H0 e String(const String&amp; s);% S% R4 c' O) L) d' k: J8 |% ?" u6 o
~String();7 s1 X( z2 z+ f; U% A' l
int Length() const;
* x. c- C  h) R% `- Q int ReadString();  p" M6 f1 y& q9 J
int Rs();9 Y* N, G: ?7 F% U: g  [/ e9 N" ?
void Prefix();7 y& _" D7 j# N* ?) P
void ModifiedPrefix();
( C( y8 g0 ?* Y7 I! q8 p6 K# y int Match(int i,String&amp; t);, c% O) Q" |( y( s
  private:
. V: l, U! \, y' Y  C" j   char *str;
! j& a( _- l+ q   int *pre;. |- _" o3 H, L* `6 ]
   int size;" i, `% ]# K, J$ o) B3 }( D8 A+ e# Y1 r
};" i! @, m6 @) ]: T% M
String::String(char *s)* Y$ E$ J) J) R. y* ]) Z
{1 t' P" g0 G' K3 K- n7 i9 c9 F# c; w
size=strlen(s)+1;" [/ M* c  O1 b
str=new char[size];; M0 H5 c# b* b: ~
if(str==0)+ e1 p$ M( ], ]
  throw "error";
, s  C# J3 d& T( G3 T/ h" [ strcpy(str,s);& l$ G1 f( Q* T: j
pre=new int[size];0 F: [9 P" Z) v+ e
if(pre==0)4 e5 n1 b! b9 h% k* q
  throw "error";2 A& H( U) _' H4 V+ F
}
9 w, {( D2 o" R5 @String::String(const String&amp; s)
5 V# z+ v' l% ~3 G' k5 @{1 l; N, N+ ^3 L+ F
size=s.size;- [8 t  g# _- P8 A& _- R) ~
str=new char [size];
: C, k  `7 [: f# K8 H9 }" ?6 v" |& W if(str==0); F6 ^- i3 U- n1 L1 A$ g( q
  throw "error";% p) V8 u( T% N' o6 p0 C
strcpy(str,s.str);
5 F4 ]& Y& }. ^8 f6 }7 p pre=new int [size];
% e' Y9 V  r9 I5 c if(pre==0)
; A1 s8 Q9 T) L( @# P  throw "error";
$ c, ?' f( t0 v5 A5 ~7 v. W. {: S}
) V& Z# |7 h1 h* g- n: SString::~String()9 F. q' P2 B& ^8 t" K* O
{* M2 o2 M8 `8 w& ]0 T
delete [] str;* U6 h1 k5 t5 k! w6 \  S# _! Q
delete [] pre;
( n+ b( ?3 f8 k$ f}
0 Q1 U; {0 z! H9 r0 W' iint String:ength() const" t' N7 ^/ ^9 l6 `
{
) t' s- C8 Q' E- `% f/ h return size-1;
- K  K+ \3 w) P8 |. Y}( ]7 P0 m$ J, V# W- u9 ~
int String::ReadString()- r- n) R. a: [  S
{% K3 w# v6 p8 E/ r+ L9 K+ E
char tmp[256];
7 {1 n  k; t, }4 v3 J8 P    if(in&gt;&gt;tmp)
% ?" O9 s  u5 n; W7 L {
% C! J* v7 \8 E! s3 m  delete [] str;5 r7 F8 Z! J# w% M& v: Z2 J
  size=strlen(tmp)+1;
1 J# T) R) S( l& R4 n  str=new char [size];
& g2 ]" O$ N, _" o' i  strcpy(str,tmp);. `8 s( V6 Q! ^0 V5 ^! r/ X
  return size-1;
/ ^3 m* d- ^- R) a* g }+ p2 D6 j9 C! y. }- C
else" O, _2 m4 ~0 b( _
  return -1;  E2 g3 f' F& S1 V: v* G9 {. n7 x
}# d9 J+ v2 x. y) C3 ~+ Z8 y; e4 m
int String::Rs()# q7 ~: [+ `9 V( j
{
7 P- U+ r- h( U4 s# c( _3 U char tmp[256],c;
7 L; ^3 j2 B$ }# P  [9 R7 [ int i=0;1 I) G1 h' N7 \
while(in&gt;&gt;c)
+ A% O/ g4 z( }: v8 _+ `( ?4 o {
8 A7 i% [: u+ [+ K" w  if(c!='*')/ r1 z! g! C& y; O$ Z4 q7 f; V' ]
  tmp[i++]=c;$ U: i1 ]/ C/ `( B7 j
  else if(c=='*'&amp;&amp;i&gt;0)0 y3 U: ~/ L. k0 E2 n. u# G
   break;- l; @8 f9 w$ C1 ?9 R: C* O/ U# h* P/ ?
}
5 P; l7 y8 f3 C- w7 U if(i&gt;0)) t  [2 C+ q& U
{
4 r7 ]* H  W* H: T  delete [] str;; u% Q) p( I2 G6 A' ]3 r
  size=i+1;; [7 n. _- w* K2 {: T4 T
  str=new char[size];
$ @4 ]) f4 L2 Q2 _" \  u  if(str==0)+ Y/ r) ~! u* S, Z  B' v. H
   throw "error";
5 g4 _/ }3 Y+ a  for(i=0;i&lt;size-1;i++)
9 F* J0 X9 `) V      str=tmp;  
, W& l5 V' T: w4 G  return size-1;7 i4 W/ c: U. Z6 Y9 h
}
7 s( }* {6 |5 {, o9 L6 A7 N& ] else# q1 C+ {4 u* f: U
  return -1;
0 G+ E; L/ I9 r' r' k' X}
" O6 A+ Z& c$ M8 cvoid String:refix()3 F- k# ~8 B  `8 o. O6 v) W
{5 @! n" J; S2 R2 \. l9 g. S
int m=Length();8 y- Y8 A8 B, ~, h& n/ k: M
delete [] pre;, |1 b& H$ H9 u6 Q
pre=new int [m+1];: v( q2 L# \) w" m) R3 t
pre[1]=0;
# m+ X' d4 F; Y7 M8 t int k=0;* y$ p$ _* L3 r9 w* U" P0 M8 g
for(int i=2;i&lt;=m;i++)
- i1 U; U; T! W {$ a& B/ M7 ^1 P4 e6 n2 F
  while((*(str+i-1)!=*(str+k))&amp;&amp;(k&gt;0))) q4 m4 z- [* D
   k=pre[k];5 s4 \, d# c. m1 d
         if(*(str+i-1)==*(str+k))
9 Z: H6 s- X7 h    pre=++k;- C( g* }* U5 c" F, A
   else! G0 e% |. s( K& @& k8 \
    pre=0;5 E' G1 {) f$ `# v3 d' `
}4 _  }3 L1 ]! k6 |1 B8 p1 g
}( X9 S2 D$ ^! C5 M, f/ u1 [5 p0 C
void String::ModifiedPrefix()
3 ~8 s3 }4 _5 U" B$ _{
8 [8 C% B0 f: W) z# ~4 x int *f;
/ [! _4 Y9 z- D int m=Length();
+ D3 p3 U3 H3 f f=new int[m+1];% Q2 p6 a9 g$ v. O- @3 W
Prefix();0 C- w) ?- E7 Z  n0 P; V$ s0 c$ [
for(int i=1;i&lt;=m;i++)/ P) X/ M# [0 |& o
{
7 w  ^6 d1 S0 Q# B$ w1 T/ L' m    f=pre;1 ?% h3 J8 D5 k/ V0 T
}
4 i9 ]; b  {9 S) L+ [; H4 @ for(i=1;i&lt;m;i++), {* C/ g; I- S% m4 v& r" _
{! y* d' y6 X7 V
  int k=f;
" R. h2 t4 L  r& c2 \" j; e9 ^7 R$ ]  if((k==0)||(*(str+i)!=*(str+k)))
+ K9 w$ q3 t3 d. |3 t   pre=k;
6 o3 X4 x# ]$ @8 Q2 o  else 7 I1 J4 i) @% s9 }
   pre=pre[k];/ z4 Y- l; c7 G9 B. ^2 B/ h* v
}
  r: z# j* z# C8 W: v delete []f;
5 F' B$ p, W$ b. E) T1 R8 y" c" Q}, f/ v! b  ]2 \! t6 l: A
int String::Match(int i,String&amp; t)5 l' e% {6 K9 n9 }4 @. }3 J
{- x8 l) `0 w3 I/ G! ]
int j=0;3 z5 S3 U; t/ Q" N$ Q
int n=Length(),m=t.Length();
$ Q1 g. _5 U( V. |7 q8 k t.ModifiedPrefix();
% Q" @4 q# I) B! O4 c while((i&lt;=n)&amp;&amp;(j&lt;m))/ v! o2 ~: B7 L) J$ y! t. Q
  if(str[i-1]==t.str[j])
9 X) w0 h' H! ?* b  {2 O2 D) P2 I" L# K/ u/ X* W+ i
   i++;
; p! K8 Z$ p6 W+ c: O   j++;9 Q6 ?4 ]3 p8 k; V* O3 A% E
  }
+ E6 J' d! S0 X. ]: ]/ X  else , S; J  U2 {! x0 P; }1 t5 [' Y
   if(j==0)
* q% P: N  \" Y+ M! V        i++;; ^4 v$ t+ d% n" b3 F# d1 [
      else
& x9 }0 [" ~  e    j=t.pre[j];
9 @9 Q7 D6 r" I$ t& o" T* R  if(j&lt;m)
8 o6 v# M9 [- z1 Z+ Q   return 0;: x, G( q- d2 Q) M* V' i, w, \$ I
  else ) d* X3 P5 \! V1 j
   return i-1;) e! E% @0 c/ v9 V3 U# b
}  K+ @- r. ]% K3 X* i
int main()8 \+ b2 y1 w  |' p% E; a/ ]
{# g9 ^4 H- Y$ m! Y5 D
if(in.fail())
5 g2 A9 d- F3 [% q* d% ^0 X: N' j* b {1 P6 |0 N1 d" H' a' M: p5 V
  cout&lt;&lt;"the input.txt is not exist!";1 \1 c. p$ l, @( F# k% B) O
  exit(1);}- |1 `; v5 e. W( u. O7 z. k6 S
int i=1;1 x# f1 U7 j# J* T
String s,t;9 G" }8 z) `3 Y1 {9 g
s.ReadString();9 A+ `0 e+ r$ Q  B% t
while(t.Rs()+1)
! a; V. b8 E1 |, V$ \2 q* ^ {, S$ V* q/ Z+ K* \8 H' o4 M
  i=s.Match(i,t);
8 n. v  p6 f. l, z: V/ j/ }, m$ a8 F  if(!i)) ^3 Z( k7 W4 H2 |& J$ J8 ?
  {
0 V3 n6 L0 S" ]- A/ T3 ]$ }      out&lt;&lt;"No"&lt;&lt;endl;
1 x! m& p3 g4 c* p! V7 x1 N! L9 {   break;5 m. X( w! k( }, K0 N4 D4 g7 o9 |1 \% Y
  }
: L! {4 u7 q* e$ E }, ?  e: f* D3 j5 E  J
if(i), L# f0 `! |4 r9 z& x1 Y' H. P
  out&lt;&lt;"Yes"&lt;&lt;endl;0 {, {- [2 ]+ n2 ^4 ~" r
return 0;
1 e. g* n( c. u( N* {6 m+ I) }0 F}

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

    回顶部