QQ登录

只需要一步,快速开始

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

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

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

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P>
6 G) m# f' v7 h" [<>[
游客,如果您要查看本帖隐藏内容请回复
[/hide]</P>#include &lt;iostream&gt;
8 S" j4 x, p& y: B6 s+ E#include &lt;fstream&gt;/ ~, Z- ^. I4 d3 Y
using namespace std;* j1 t6 x) p/ z: c0 Q
ifstream in("input.txt");
; b8 p  @  I1 d, C2 Kofstream out("output.txt");
) r) D% @( D# r; iclass String
) Q; h) L7 i( n6 w$ t! Y4 N+ `5 h{$ M5 r8 H* @$ W8 P4 V6 ^
  public:
$ }7 j0 S& l/ p5 G  O! }/ H String(char *s="");
, s' D' K+ M% S/ F2 f1 B% Z String(const String&amp; s);
) h. X: T- `/ d8 A. G) X ~String();, A0 V# F& J* k
int Length() const;
/ b- {9 Q) {, a3 C! s' q int ReadString();
" N2 v- ?6 ]& N5 L int Rs();
; l1 _" b0 J& j, G, m: v% X! b void Prefix();9 @: J# e$ v: o) h7 C) Q. z9 b* Q
void ModifiedPrefix();) d- c8 K) L$ M' r$ e. C7 N9 z" V
int Match(int i,String&amp; t);
' a: J$ v& |+ R( K; B6 w5 _  private:
" A( W$ {; Z( x   char *str;
6 g. [& D4 v! o  W2 _) F4 S2 [   int *pre;
+ `7 T" ~2 [' r   int size;
( b6 @, k+ x8 k. \4 W/ y- L};
- Y( V& l# e% `- TString::String(char *s)
9 ~2 K% y, c3 n$ m8 ^* o' c{, w! g* n( F$ X* b5 e& J
size=strlen(s)+1;
9 ]* F( `: Y# z; N/ J" X str=new char[size];3 `' J8 b: M( h! Z; m
if(str==0)
9 G, [2 W' l3 f4 h0 ~  throw "error";3 t- b0 {" t5 t* Z5 x7 p
strcpy(str,s);
, r5 O* K% D: R7 ] pre=new int[size];
: Q' C% |0 l- O8 p: W( N; g( g8 E if(pre==0)
3 x8 K0 v8 m: ~* i  throw "error";
! G* K- s& B) Z. U# G3 l}7 D. r  {: D; R2 E
String::String(const String&amp; s)7 N, o5 a1 k5 n: N% h9 S
{
0 J  v7 d3 J% h0 M, w! A' A size=s.size;! \3 V0 M8 g: Z: l( [! ^& J
str=new char [size];1 ~  ~* F# r$ `5 R6 Q
if(str==0)
1 P1 J8 M8 ~- X( P  throw "error";
/ e( m9 P' u; k( ~( [# M strcpy(str,s.str);
. @  \8 C& U$ a/ S; _2 r1 q pre=new int [size];, n1 w6 ~- u1 E7 {9 O+ A; n/ s, M
if(pre==0)
/ ^. Z! Y- Q. n& C$ }  throw "error";
7 G. X! s9 s- c: G8 \3 S, V/ b+ P* O}
1 e- C0 W2 V2 }8 E. }, tString::~String()
* Q3 P0 \6 m6 s* p# g2 W8 p{9 p3 I8 j: u' O
delete [] str;: m% b+ {( A1 i$ [' V: z+ w8 x7 }# s+ b
delete [] pre;
* z& W% J4 T( O2 y$ ^2 A# K}
3 I% a; f$ Y" d$ z+ Y1 uint String:ength() const5 s- S0 i# E# ~
{+ @1 }& ^- a1 B
return size-1;
1 C! t; z5 w1 m+ C/ M( t2 y& T}7 o! H6 N: j$ G/ H5 l% n4 Z
int String::ReadString()
* \/ h7 D5 \( ?: p* e  j{7 p  F+ P$ Q+ d2 t1 J
char tmp[256];6 X+ _4 L" y. S7 {. B6 C2 c6 |
    if(in&gt;&gt;tmp)
9 G4 J& |2 Z6 M; ~ {
6 Y1 F; y9 S" ^/ e  delete [] str;
5 Y8 s+ Y4 J2 Y+ @$ \( f  size=strlen(tmp)+1;6 Y/ ?. h& U+ {( R$ |
  str=new char [size];; b" }* O/ i% y) ?8 q
  strcpy(str,tmp);
; o0 z4 l% x0 G  \) e1 |& V  return size-1;
- `4 X4 p1 B8 R3 u# s6 y$ e }& M: ~7 o8 T, u# o3 Z
else
5 D* F2 {0 w6 V  return -1;
  C! b3 A' s# b4 t* l$ t+ K}
# g$ [% B8 b, P( T+ n, M" nint String::Rs()1 g  j2 n4 @1 h, J, |. N5 w  A: ~
{( B) B! O% q' B" P4 G
char tmp[256],c;
; n0 o- h7 N& G int i=0;
! |8 ^+ P5 @9 R while(in&gt;&gt;c)
9 p5 S) U: z$ Q. J5 e {5 n  i7 Y$ a$ Z' d8 h1 f# X
  if(c!='*')3 n, }1 h# }/ t2 O  D
  tmp[i++]=c;
0 [# N2 m: b  K: o) |9 o: K  else if(c=='*'&amp;&amp;i&gt;0)9 }; \$ S, }. Q+ u0 d" m
   break;. Y" |# H/ [2 ]" e% h' T% f9 ^
}
  I. f1 f1 j8 L( o if(i&gt;0)
" c" k6 p8 b$ z6 |" p3 S, q& ` {  g: x1 ^. O  c
  delete [] str;
: p+ ?& j( c4 ]  size=i+1;
8 P) r+ B* x+ Q* o/ g  str=new char[size];# j) B) m, e; ~+ u3 K% m
  if(str==0)
/ B5 _) {+ M; @% I# n3 r1 v5 |   throw "error";6 z8 [$ D/ E' y; k& d
  for(i=0;i&lt;size-1;i++)
; j% T2 `* w" `      str=tmp;  ) b4 i) B0 \  n6 w2 P+ B/ p; S
  return size-1;
0 [5 A. h8 p$ O+ V& S  R }  x" g- z% q# O7 [2 @( B3 o0 g5 y
else
8 o6 X4 R' T$ a: {: W3 i: z) c  return -1;0 ?# H; H& d& ?# C. f8 S% Z$ b7 \
}* l8 I9 H. V# n6 n7 U! U
void String:refix()
& `  P; |4 A8 m# m. q{1 @7 g$ u1 U% U# }5 v7 p* r( s
int m=Length();
1 @5 R; u7 S2 _ delete [] pre;4 ~; s; m% a7 ~2 Y1 A
pre=new int [m+1];; Y- ~4 C6 o# A$ ^2 K" l" Y9 [
pre[1]=0;
' k, k$ ^% c' w* C9 @6 z int k=0;
5 {' s- C: Y4 S# Z% ]  `2 }5 d for(int i=2;i&lt;=m;i++), {( i0 a2 Z6 E+ }3 S
{
8 w9 L5 h3 f6 a& l* q  while((*(str+i-1)!=*(str+k))&amp;&amp;(k&gt;0))4 C) n4 y# P  T4 x* r  d
   k=pre[k];
  J+ `3 t( L& N& L8 q  O         if(*(str+i-1)==*(str+k))
2 B! ~8 A. }" s# a8 k8 o0 B    pre=++k;' G5 P/ j# m9 n! n" p
   else8 m$ |0 |* Z4 n
    pre=0;$ G2 \+ Z0 N5 q5 n: T$ q( H
}
  T+ Y, G' D* `/ j" r+ y3 ?% z4 U" M}
7 w1 I! F; D9 F, ^void String::ModifiedPrefix(): s9 w8 l( c- w0 H2 G
{8 m' K. A% G7 P4 p$ u
int *f;
1 [' l6 f0 ]; {, y; ^) v int m=Length();
0 \- i8 L8 z! s9 L9 x5 I f=new int[m+1];
$ f$ M% |' o# |% o Prefix();% w; Y  g# G, d5 g) [4 O- G$ ~+ z
for(int i=1;i&lt;=m;i++)9 D& P3 D* T  R) L6 u  c+ ?% K# _
{( ]% l& E* I6 s8 H# q
    f=pre;
' ]4 k/ D8 g& I  U }
$ X) w7 S- R; d  w! v- O3 q+ _ for(i=1;i&lt;m;i++)
' t) P8 ~9 D6 T4 w: e: c- E {7 g1 X+ [, m4 A9 d
  int k=f;
$ n2 ~# i% N6 V. I& a+ h% v# A5 w  if((k==0)||(*(str+i)!=*(str+k)))4 i1 m! r5 _9 n% s4 ^0 {
   pre=k;2 p$ e  j- v: e: F9 Z
  else
, S! Y- Z1 L5 H0 E0 r  F   pre=pre[k];
: W, a1 q1 k; L7 I }
; u8 O, s; [* \, }4 L delete []f;. w- ?0 C# ]' Q# G; J; s
}! @7 ~  _3 ~7 s) _+ S+ w
int String::Match(int i,String&amp; t)* ~2 h) K% {; _& f- W; ?
{7 Q" f# g( d4 B, V! k  g
int j=0;0 [0 {% s& G  _# k
int n=Length(),m=t.Length();
. K0 P! y9 ~1 x: V5 Y t.ModifiedPrefix();( b" a* C2 ]% X3 @
while((i&lt;=n)&amp;&amp;(j&lt;m))
0 r4 _: ?; N: H6 z( t+ ^" _  if(str[i-1]==t.str[j])
/ e7 f' A) K* t$ b% E2 L+ R  {; R7 E, n6 x) \, z
   i++;5 ?3 ?" P0 a; y9 O% b, g
   j++;! I0 R) v7 F5 o& |/ f6 I5 V
  }
* R' ]$ k0 ]# \3 `: M3 g; b  else ( i' l" K; n  @* l! E5 a6 ]: j
   if(j==0)! C& v! f8 p2 d: i# M' v
        i++;5 w  j5 d, e/ ~; C; O
      else
& _# i; I% C0 ]8 _    j=t.pre[j];
- @# C: N( X" V/ a4 {! S3 J. J  if(j&lt;m)1 m5 g/ c  C: Z  v- z* \, l( @
   return 0;
8 g" ]8 Q, c' E) R  else
; H" c$ t$ [3 F2 d: @   return i-1;+ W, g: l: A1 e4 j0 Y
}
2 a! b+ \) h* ~! G4 G  [int main()1 D3 o( R5 Q0 T1 U( y
{
. L$ f  ]  ^3 _. N1 L0 V if(in.fail())! Q/ K6 G, ]- ], ?2 g1 r# N6 E
{  C" b/ u9 P" B- ?& B+ e, h+ h
  cout&lt;&lt;"the input.txt is not exist!";
; I. l5 C+ _; p( G  L5 B  exit(1);}
9 y$ G( [2 g/ h% ~9 j- L( } int i=1;+ N! _4 V! U8 ~4 Q1 l
String s,t;. o: R2 z2 \/ m: R  X' k5 h4 n
s.ReadString();+ o) }9 K- Y7 d* {
while(t.Rs()+1)4 G- L' D: J  I# I  H0 A) V2 M
{
- b7 {4 R& ]& Z: z  i=s.Match(i,t);1 h( j/ D$ e5 \8 x
  if(!i)
, W, x# i" }$ f  {6 D8 ^8 K/ @$ h/ r% [' Q+ c
      out&lt;&lt;"No"&lt;&lt;endl;7 w  \6 q4 G6 D5 Q+ e5 ^
   break;3 J! B# F0 m/ M2 U
  }8 H8 T" ^, z* x4 E
}1 d" h3 _! O3 z
if(i)3 e: i; L' u+ [$ b) _
  out&lt;&lt;"Yes"&lt;&lt;endl;* l( m4 |; l, j! I8 h
return 0;# P3 Q0 Q# u, F5 e, O) I
}

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

    回顶部