QQ登录

只需要一步,快速开始

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

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

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

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P>4 j) ]" u) E. }- d* d
<>[
游客,如果您要查看本帖隐藏内容请回复
[/hide]</P>#include &lt;iostream&gt;/ j; A3 b7 U0 R+ a
#include &lt;fstream&gt;6 g  `" {' W$ R- l1 o7 e# U% \
using namespace std;
2 y* C1 g, t  M9 Eifstream in("input.txt");
5 V5 K) N7 S. P' A" [5 q% g; h( L5 gofstream out("output.txt");3 n7 \( k) p! e  R
class String. s. w) |2 X' F% A3 |' Z& A6 b
{
! d9 A& Z) Y5 K+ s# v& N  a4 {  public:
* J* ]& f% h7 I9 x/ C. I String(char *s="");
& o* n3 ]# S0 g& u$ ` String(const String&amp; s);6 u8 I! }0 N& t( W! Q
~String();) U8 u+ ^. i" s
int Length() const;) V8 l& K! j% Y3 T
int ReadString();
2 v% A. D& F/ E; v" b0 y8 n6 H int Rs();5 p& |& O" }( n
void Prefix();6 s- ]8 _3 _$ {: A7 c
void ModifiedPrefix();" y$ u5 r2 O# A# j- M
int Match(int i,String&amp; t);% O: r' }+ V' H4 _( H
  private:
' x  f" \0 t$ O3 O* C: v( A   char *str;
* O5 j  {7 B9 v5 E) n8 ]   int *pre;' K; h$ {$ T: K+ `0 S
   int size;
3 o1 s/ ~5 ?. b. m6 M};
3 u/ T" X* v- S. R# }5 e/ XString::String(char *s)& L" _+ p3 s; M( Z4 |! r
{
) A; j3 S1 g- n* F* | size=strlen(s)+1;6 E4 t3 S+ k; @1 B$ Z
str=new char[size];; c" O7 G  B$ S; E/ [
if(str==0)  {1 n' b8 A- E# I  r" O: X
  throw "error";
$ C' A# [1 H0 x strcpy(str,s);* c; |0 h) P  y2 w) M
pre=new int[size];( b% I" H6 J4 d( H  _3 m7 v
if(pre==0). Y8 V% P6 R4 t& d" P6 k4 q
  throw "error";0 B: X2 n' ?* w/ N+ F9 a0 R
}$ `$ E7 a, C. D- k9 i2 D' ^
String::String(const String&amp; s), x6 z% k% E! l, a0 V0 ]
{6 E0 v1 {( L9 W9 `
size=s.size;
' [+ _9 ^/ e) W% E str=new char [size];2 ]2 S" P: H& S+ }9 j7 d
if(str==0)$ [! J+ z0 D  d/ t( k4 i, k
  throw "error";/ {: U& Q; V9 [
strcpy(str,s.str);& m% a# U- A7 N9 \( M+ z2 d% H# Q
pre=new int [size];
: g! X# a: O1 j$ M/ @6 ~% o if(pre==0)5 S9 s$ G$ n" q
  throw "error";* K% c; x% b% b6 p/ J* ?" D
}
/ s/ T# `) k6 U3 z) XString::~String()
8 E6 [2 w: F! q- y- ^{. c7 x! m9 i  C+ Y5 M( |1 c
delete [] str;* j$ i! ]* X. F  y3 r
delete [] pre;$ j) n+ S1 `' u8 [9 i- H& n! p2 j
}
3 S  ]! e1 H4 j/ }) p( F; mint String:ength() const0 Q6 q& ]7 W6 s. ]
{
5 G; w" Y2 I* c" E, T! u2 D return size-1;* x7 M; R8 y0 E8 {! h
}
# y9 C  |' \$ ]- Sint String::ReadString()
. L* ?& D' C& ^) s) `{
& I! T, t. l2 e4 C3 {- C+ e1 N! x char tmp[256];* t4 `/ Q# W3 w$ m3 j( C" f
    if(in&gt;&gt;tmp)) w. t5 K, A/ H8 U! O
{
8 M0 g  o& q, k2 g  delete [] str;
4 d! o% S$ v2 J# I# v  size=strlen(tmp)+1;
, L/ e6 i7 L9 H) J3 l% I. ?  str=new char [size];
, K1 N' R, I, J, Y8 o# G4 _  strcpy(str,tmp);& q0 M; v$ a* x; I. }. a
  return size-1;6 T3 x6 K: v: @8 i, X8 K# H, t
}
) x$ e% @2 J, \0 J- H else6 p  G2 m' Z  S. k3 p
  return -1;
2 C5 q, l2 u0 D/ u6 \}4 E7 {! g4 a4 _# k1 @: `  O3 ^
int String::Rs()
& Z& Q' g3 R+ a% j8 a{
* ~" ?5 e. U! t# Y- g) N char tmp[256],c;
& k3 b5 a# D; } int i=0;( D, ?; `* u7 J
while(in&gt;&gt;c)9 I3 z1 S, ^* g" A' j2 v
{" \& T- P/ Y2 K* h" q' h6 ?
  if(c!='*')
+ _; [4 m" x4 R; x# y: E  tmp[i++]=c;
, F2 A, y. L2 Y: O2 y  else if(c=='*'&amp;&amp;i&gt;0)# L8 ?/ v. H# r7 }9 ?. w6 h
   break;
: u' A$ F1 T( h% W# G2 S }" C4 u% \: Q4 g! c# z' V
if(i&gt;0)
  [! ]- D# E0 h; l {
4 J7 F* T3 G' {# u  delete [] str;
& ?3 V. v! |& j3 y6 ^  size=i+1;
8 Q8 y- c+ H0 \2 D" U' ]  str=new char[size];6 n$ o- S1 z+ q3 R# X/ a6 }" E
  if(str==0)- `8 G/ \8 D( W3 y$ [
   throw "error";
6 O& b3 r+ t6 |  for(i=0;i&lt;size-1;i++)
# _5 I* S$ }  E4 B4 F      str=tmp;  9 q% m6 A0 M* g* @$ e9 M
  return size-1;
. J; `- L2 ]4 \" q! a }. q  @. c7 l/ o8 k+ G
else
/ d8 k  ^2 s1 s- A  O) u  M  return -1;' M* O0 y' E( g  O, r
}
/ H6 ^5 I9 O& q7 b6 _/ Rvoid String:refix()
: \7 G* l2 I8 C4 \( q0 E{
+ f, J/ x. H) I; T! J! T int m=Length();
- n- Q; ^8 B& t6 x  I delete [] pre;2 {( U3 P3 b0 i7 H! A
pre=new int [m+1];
8 d" H( v( S/ ?3 U+ P! G* c pre[1]=0;
; @1 m$ E: |- G& Z; E int k=0;
  }3 I6 N( B3 r, _ for(int i=2;i&lt;=m;i++)
8 d* e5 x- x; A. p; Y {- Q1 ~0 X  B2 h( p- \* Y6 ^
  while((*(str+i-1)!=*(str+k))&amp;&amp;(k&gt;0))- C. L; O* l" X+ E
   k=pre[k];- X$ \7 j( z1 _8 [2 Z. X
         if(*(str+i-1)==*(str+k))- \0 R: Q; o% e
    pre=++k;$ M0 o7 y% I8 U( _# M. \
   else
. y+ |4 l0 |$ n5 W    pre=0;
* X0 W) m' Z. n7 N. l }/ u" O2 `$ U( @$ N. X
}
6 h+ B  ]* Y$ j' O0 @) L2 `void String::ModifiedPrefix()  |% Y* {" U" }( i. \
{
' ?6 U4 _( i4 U) f# | int *f;( Y! g1 U3 b, R4 d& T- i
int m=Length();
) P$ h' E- t; J f=new int[m+1];
7 ^( i, Y" V/ A% x Prefix();
: d/ g4 p3 Y  O6 {6 V/ f) @ for(int i=1;i&lt;=m;i++)
) b  t+ D' m6 ^4 ~ {
. y7 U, D! f! I5 K    f=pre;
6 a7 Y1 S$ Y( h+ q' T* W }
* F& Y3 U2 b! ] for(i=1;i&lt;m;i++)
3 p2 E$ M8 }& H* ~$ G6 P7 o" s% n {
  p) {8 Y, C' F  int k=f;/ u, U' g1 s5 f8 t
  if((k==0)||(*(str+i)!=*(str+k)))
9 l  N. c! o6 |3 R& x' R   pre=k;
$ M, u! U# P7 D  L8 W2 e  else
% f% O; P/ P: a% f9 e, k2 e   pre=pre[k];/ c. k" O9 W* [& Q1 ~8 ?4 U
}
$ j4 H4 q% K2 u# n4 w# O delete []f;% [+ c2 ~. }& m. @
}
8 @0 Q0 m/ \( \+ Y  }int String::Match(int i,String&amp; t)+ i* c% K1 c+ x, a& l. B' Z' @
{& z3 t% h3 y0 l, Y
int j=0;. M8 w/ N: Z- O3 k
int n=Length(),m=t.Length();! E' D1 y9 u6 k1 u) u: l8 w3 ^% @0 E
t.ModifiedPrefix();, w1 ~) [- K. o7 y. I  d
while((i&lt;=n)&amp;&amp;(j&lt;m))% g: c, }. F; f# E
  if(str[i-1]==t.str[j])1 K7 T0 A& h8 y4 B* K" b9 f" Y
  {
# u6 }. K+ ~/ }3 V# G! j   i++;" I: b" X* L4 p# T) X" h
   j++;; P1 u9 m& M' J: g& H# f0 R
  }
% q2 L5 M. A2 @! c/ R( P  else ! a! j* e- }& n! F% A. f. J
   if(j==0)
' n& C& R0 h  f        i++;
: e+ C+ t( j, I" e( |      else " b3 O4 S- F5 g3 v
    j=t.pre[j];  f$ E' M/ @& L7 R* L
  if(j&lt;m)
, b0 F0 l/ r0 f9 d) f# l: u   return 0;" H* R) W2 P5 X8 M7 S2 k# ]0 q
  else . ]+ `4 w3 Q3 g/ ~
   return i-1;
; s- z! S0 M; H" c. W+ m}
  e  U4 ], S7 c3 _) E( Sint main()
' a' g+ r. A9 B/ q# r{' ~7 M; H5 ^7 N
if(in.fail())
6 o% u# W& @7 {- c& a, m3 }0 | {! a: S0 ^3 o5 G+ Y! T: g
  cout&lt;&lt;"the input.txt is not exist!";- {  \; A" M+ @6 w
  exit(1);}
& k* A1 J0 h5 }% |0 Y int i=1;
* e/ E0 E6 V5 k6 t7 ~2 D, _, G String s,t;
! o: G' }0 J& Z( U. r/ i s.ReadString();$ ^* r9 L$ V8 Q3 D0 z
while(t.Rs()+1)( ?; ~7 m) C) W, K3 z. J
{
9 V) [4 H# B$ f3 E4 s  i=s.Match(i,t);/ r' T0 Y# ~' c$ C! Z0 F/ q. ]3 ~
  if(!i)' E6 r5 K; n/ d" p, ]
  {! Y* [$ Y+ a2 o/ n5 }
      out&lt;&lt;"No"&lt;&lt;endl;6 @# I# {2 ^, S9 h
   break;
6 K/ y+ c3 R& k1 J% o! C  }$ K/ ?% ~. p! |
}; i0 W, e. B4 M4 c3 G9 K! b
if(i)3 s& ?# o+ W1 k) P, g* C
  out&lt;&lt;"Yes"&lt;&lt;endl;
5 b" a. z9 X) s; `. v return 0;" w9 O+ j8 N; A$ d4 O( z
}

间隙字符串匹配问题(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-7-30 02:57 , Processed in 0.705350 second(s), 89 queries .

    回顶部