QQ登录

只需要一步,快速开始

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

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

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

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P>
" U5 t1 C+ ~* b7 d% v7 z<>[
游客,如果您要查看本帖隐藏内容请回复
[/hide]</P>#include &lt;iostream&gt;3 h! x5 s3 n# |4 \* M5 {0 R  K4 ^
#include &lt;fstream&gt;. O; F9 J# _2 g% F% x. Z% t
using namespace std;) A% Z: b/ ?8 @+ O4 |+ W# l5 _6 S" }
ifstream in("input.txt");
6 t9 Z8 C6 k" `7 l0 Yofstream out("output.txt");, z. `, B" j6 G9 k  q" L; M1 F5 [& v
class String
( M0 n  c& D9 b( `" Z0 L% W8 l! f{* a& k! N6 h( w# _
  public:
6 O1 \! A5 F7 }/ Q, K String(char *s="");
! Y8 a, B) ^) e+ Z; s String(const String&amp; s);# n, M/ b  G& D) O9 t
~String();
' U) `; X$ Z1 `* E int Length() const;# j: {! c" z7 |" R8 l( B) U% ]0 P
int ReadString();
, T+ h  H9 d. k int Rs();, E5 e3 j. {3 C  l& T, v9 H1 n
void Prefix();* z7 r& n: F" a# ~  U: I
void ModifiedPrefix();9 q' s7 l0 o3 m9 A& @) p
int Match(int i,String&amp; t);4 u2 g# v5 _: H: D* v; r
  private:
4 {  f* U+ W- ?% r/ b0 K   char *str;
" N  v7 C6 f# {6 K$ k6 U( o   int *pre;
. f9 l. p! p* ?- a( e: p: Y   int size;$ p3 |% n- {5 l4 b4 N
};
4 t! f; ^6 i7 ]' L' \! y; B, VString::String(char *s)( a- B) e; K3 [$ ?" ]5 O
{
8 k+ D$ B7 n1 o/ w# f. C) k size=strlen(s)+1;
3 L/ W7 J: X1 T0 H str=new char[size];
; h/ ~/ `8 K( I+ C1 b if(str==0)0 K6 i$ N% X, w5 z$ L9 g# Y
  throw "error";/ S( I& ~4 T' G0 z* V% r! c
strcpy(str,s);
5 \# D% _# R2 S7 K2 ^ pre=new int[size];
7 z$ k, j: E9 s% K+ L5 T if(pre==0)
% \- G7 ?2 U' S, N7 Z  throw "error";
) X& C3 Y7 F+ }6 c0 d2 h}: Q/ }; N+ @/ {4 S
String::String(const String&amp; s)" [0 x; R  ?* y1 [! z0 ~2 M
{
8 K0 @+ ?2 h5 N  U+ E( e size=s.size;
( N9 @! f8 X1 A. q str=new char [size];
% w/ ]4 [  R' z3 y, t; a- Q if(str==0)" C& H2 p5 X9 y
  throw "error";
1 g1 y+ P8 G% F' G. {8 n strcpy(str,s.str);
1 A- f# t5 m3 I1 W7 F pre=new int [size];
: a8 I/ r' q. Q* a4 c; Z if(pre==0)
  h2 `2 D7 B7 g6 h  throw "error";
) m" v% u2 B. S+ i/ q}; C' N" Y7 U! m; y
String::~String()+ g6 o0 L) X. C& D/ S
{
' |4 T3 h# r! K. X delete [] str;
! ?2 l( z8 w. C, p( @& |( e% b delete [] pre;8 Y. I! c# M; T  E
}. {) b' d6 ]/ ~$ m
int String:ength() const4 g( W4 \3 [& Z, q1 D: M8 C/ a
{
+ B. X- F8 X/ N3 ~1 j- i8 K return size-1;
, Y1 f' _/ e' C  V* ^9 b1 a! ~}
, o2 H7 _6 _8 m7 G$ {3 {' oint String::ReadString()# H0 W; N  W% M
{' ^5 i! n# @8 x- e* H0 ]7 m- u- k
char tmp[256];
7 H  A/ O1 b; x1 x6 G$ ^( {    if(in&gt;&gt;tmp)
) p( U. o, `* ]$ X {& _* }- b' {  h; b$ R
  delete [] str;
6 h/ o$ K" y/ q7 s# ~" T( p( K  size=strlen(tmp)+1;$ V6 [* Y7 J2 n4 M4 l1 w" R/ h
  str=new char [size];
! I$ F! Z' Q! O2 u  q  strcpy(str,tmp);6 ~6 `9 Q: J" Z: K5 O9 a# g
  return size-1;- L. B( d% S* _# p8 d* p. [
}5 ^3 i8 \: Q7 |% B, b
else; B6 c/ M/ _7 I& F/ x: G
  return -1;
2 m7 V( f$ c; J- t}
! J8 m( b% u$ O! X* @$ Jint String::Rs()
9 E$ v! Z$ W- @3 B: y, a2 k. l9 X3 C: B{
& g6 e; s; J' ^% M! ?/ | char tmp[256],c;% d* m2 A) G0 R
int i=0;
, M9 D$ T' A9 T$ Z0 F while(in&gt;&gt;c)9 B) a9 A( D% Q9 R
{8 U+ ^4 E9 k0 ]% H" D+ G& A$ B* i& F
  if(c!='*')
' }' {5 n. v* f* r- O  tmp[i++]=c;/ q# {/ d. u! t0 w
  else if(c=='*'&amp;&amp;i&gt;0)
; e! [0 F1 B; K6 l( C' }   break;" f) f1 F! P. @. p+ V
}
( `( i: p4 p5 ]& [6 k if(i&gt;0)+ K7 G8 j# A" z! @. |( m6 Z
{
( l- @% I' r! e3 O1 K$ y; T* F  delete [] str;, l. G8 c. S2 t( h! I4 `% k- a
  size=i+1;1 V" F4 i1 W$ E4 m
  str=new char[size];
7 E( y  b" x1 m% |  if(str==0)( c+ Y$ x/ E: W7 A1 h  O5 ^
   throw "error";
" N5 t+ Q9 R+ w, x- U: |  [/ @  for(i=0;i&lt;size-1;i++)& T3 F( o! ]' P1 r6 U, p
      str=tmp;  1 {5 k$ q# J( T5 P, {
  return size-1;$ I7 e1 N- g  J- c' x9 u* l
}7 H7 u3 k" f+ n$ O' D3 t
else
1 ]/ D* y2 z5 d: u* L  return -1;$ b9 c0 t1 L# r& X
}0 o! c6 n, C3 B) P6 b
void String:refix()
7 x4 `' a. \6 L0 N( r1 }: I{
+ R5 z- ~! s% l7 ` int m=Length();& r/ r9 u3 ^2 J0 @, g% \+ ~
delete [] pre;9 k1 H3 y1 g0 Q9 v
pre=new int [m+1];; t# I, C* |- L/ a$ p
pre[1]=0;7 z  P1 t% X( d& ]$ M
int k=0;4 r  |: }3 Q" e) r6 V
for(int i=2;i&lt;=m;i++)/ p! z' E+ P- p
{
( B, p: `+ {0 ~" [# O1 ]; y( _$ }3 X  while((*(str+i-1)!=*(str+k))&amp;&amp;(k&gt;0))5 k2 S% N8 Y: z/ Z5 L' q# X& V
   k=pre[k];
  S+ Y: i2 |/ m# B+ w         if(*(str+i-1)==*(str+k))' z$ d; |% \: y2 Y
    pre=++k;
( {/ v: U7 z- L   else
' x+ C( K# B' H! ?' H    pre=0;! _! k: M, ~# f
}
4 h! u) k  o# u+ }}: S$ B; q# J9 `  k% |
void String::ModifiedPrefix()
# ]! k+ S* ^. E) m5 M; y3 W{8 R. D. U( S( {) P
int *f;6 w) n5 Y; E7 J; K# o- c! n& m, |+ A
int m=Length();
0 [! n9 S( T/ u f=new int[m+1];
/ [% Y2 ~0 Y' `9 }2 [6 P Prefix();! g7 P. L0 L$ g& y
for(int i=1;i&lt;=m;i++)
/ ]0 B3 z& q. F8 d {
7 P2 X  a0 U0 c. l    f=pre;
$ M$ m6 x$ D  I  h }8 q$ }0 }" N5 l" D
for(i=1;i&lt;m;i++)' }( j: z5 Q( I: U) {
{9 M9 V% u' v3 W5 h. x* l! t  h
  int k=f;
! }5 z" k+ A" F' p) [  if((k==0)||(*(str+i)!=*(str+k)))
$ \. Q* e' X+ A2 z" N   pre=k;% z1 N/ m9 _$ K& H& t
  else
" ^9 W2 [7 z5 S  Z. Y; i   pre=pre[k];7 j* Q4 p! @5 b
}
" \8 |( K% N1 D$ C, d2 N delete []f;
0 O: `7 t0 m' g) ]: S# J) I4 l}7 b4 U+ v( m/ Z  G
int String::Match(int i,String&amp; t)/ w. r2 D. b* C, @0 \* n
{
, _* I8 B- D( N5 |- l# e int j=0;& _1 V( z- E% b, J
int n=Length(),m=t.Length();
, l7 O: f% s( M9 Q/ K  c, p$ r t.ModifiedPrefix();
4 Z% o7 q7 J1 L4 e+ U: x while((i&lt;=n)&amp;&amp;(j&lt;m))
; Q# ?! i( Q2 k2 h' `/ t: f  if(str[i-1]==t.str[j])" I8 ^* ?+ F6 z. C/ C) N3 z
  {- g* U8 _7 g, {5 f3 p  Q9 ~
   i++;' g8 @, v8 L4 \. A# N
   j++;$ P# [- U3 ^! {8 J
  }
# V4 d( ^, ?" W9 h  else 2 A. f) `1 |0 G0 z# R  U! ^- E
   if(j==0)# J* G, j" p! ^! a" R
        i++;
* B. T% h% z$ j* @  h1 }, v      else
* H* Y2 ~0 {) T! H2 f' }% Y    j=t.pre[j];
, N, x, _8 D( k- i$ X, u* G  if(j&lt;m): B1 t, R- v, A# t8 c
   return 0;7 K. \$ {; `8 x0 j8 K. N5 ]& _
  else 4 u+ k4 q& r1 z' B# j) W2 T! g$ i
   return i-1;( F( Y  w2 C$ l, f* B2 u4 G  ]9 Y
}4 D. H: N, ?- S5 H; J
int main()
$ y, }' G) J& K" Y{( C$ F1 S( _6 U# l5 K
if(in.fail())
# v/ y* O/ m/ L1 W( Z* q {
  u, v5 E# Q( |, s+ i  cout&lt;&lt;"the input.txt is not exist!";- \2 X7 k$ f: p3 C& j3 e7 i, [
  exit(1);}9 F1 B- V% b% ^  `/ h
int i=1;
+ K. A, g2 Y  }' w String s,t;
4 d( J3 S, X3 b0 s+ A s.ReadString();
. E) W0 k2 w; t* K; n; c6 m while(t.Rs()+1)' y, ^5 L1 ^6 ?4 s
{$ F% ]0 \1 {: |: @6 D% n
  i=s.Match(i,t);
  U9 {+ Z2 X$ _( U2 t8 C' W  if(!i)
8 U. Z. Z) j5 W; I# _. ]" [  {
9 m; u: k- g0 T; b      out&lt;&lt;"No"&lt;&lt;endl;4 P1 h6 _: J( R$ T. D
   break;
3 |+ }0 M0 L% I+ M& w  }
7 I$ {4 j1 Q8 g }
( b0 `# e4 ~( L3 L if(i), P, u$ a( c9 J1 N! ^
  out&lt;&lt;"Yes"&lt;&lt;endl;: v7 A3 N5 b1 w% n* x
return 0;
# R$ o- _7 A. H, F( w0 }}

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

    回顶部