QQ登录

只需要一步,快速开始

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

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

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

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P>- [& Q# d, z' x$ A) [: Z
<>[
游客,如果您要查看本帖隐藏内容请回复
[/hide]</P>#include &lt;iostream&gt;
4 Q- L. J! l4 ]! s) X* Q  @#include &lt;fstream&gt;
+ `) \( L& e( \- \, C/ ~using namespace std;# N- O6 j$ n9 `- x. m3 I
ifstream in("input.txt");# Y. l; o' h* h! y9 w0 H/ ]8 E
ofstream out("output.txt");
; F" \2 y% n6 s$ @+ w' Sclass String
8 p0 b' ~) d4 r, ?* M{
% J8 z7 ]$ x: [; ~1 E- u  [  public:
5 K% A6 t  q/ k) V' ` String(char *s="");
! Q" O) Y0 K1 {/ j) ?0 E String(const String&amp; s);) K* U5 Z% u; H+ U/ X2 U7 L
~String();
* `+ Y9 A4 A$ d9 T# M0 Q9 G int Length() const;
1 b! u, Q- F; E2 t& W int ReadString();* f, |. }9 s* A( ?* k0 p+ y4 G
int Rs();5 I4 u. Q1 U3 ?. }; k
void Prefix();
2 E6 U7 K" R  Y( u' { void ModifiedPrefix();
5 v5 h; R& O& y% R9 ] int Match(int i,String&amp; t);
, ?* d& x1 Q) F- P( B# T  private:( ~7 j6 Q1 f" C8 T
   char *str;7 j) ~4 p2 j: T9 {. q
   int *pre;
! j; t9 F3 z2 ?   int size;
# z/ R# \3 X1 |2 W$ X};
3 I5 U* D. Q' BString::String(char *s)! R" C0 X/ @) b, V$ U! H  ~0 x% H
{
# V8 m$ b* F0 I size=strlen(s)+1;
" z9 P. k. u" C( R& O* ]/ N: w str=new char[size];
$ i3 Y3 W# w1 t! v, B4 ` if(str==0)( S2 Y" c1 N( G5 Y. |' q+ h
  throw "error";
! S, Q; {2 X! r4 j8 W; w- x  w strcpy(str,s);. r3 d1 r, Z! y# N- \" B* ^
pre=new int[size];
- H+ N2 H* f) ?$ d. D4 j if(pre==0)2 N7 A9 Z- j5 R+ q
  throw "error";
6 I5 Z1 I% I! v) d* N8 g}
4 t6 [& e- E- H+ @String::String(const String&amp; s)
+ W. b: X( W+ N8 ~6 i{
* V( I' K" t! S size=s.size;
7 ?! X" E6 L" S6 b6 a8 a8 t4 h str=new char [size];; n" _" R/ b* m9 `( n
if(str==0)7 f" d% R% ]$ G9 `4 G
  throw "error";3 U$ u+ i+ Y0 V  J
strcpy(str,s.str);1 y8 k4 e( s7 t$ f. u5 ]- d
pre=new int [size];( \* i; t) `6 d2 B/ x
if(pre==0)
/ c# b* M' M( o/ ?3 ~  throw "error";: E2 i  [5 T% K4 v/ ~
}
8 u; k; Q4 H  ?0 h- v1 t+ H- S5 OString::~String()9 X& v  V9 B$ y1 P' l2 Q
{# }' _& r% J: a4 i/ m0 {8 K7 `
delete [] str;+ T6 I! G  K% x& e5 r  Q5 g
delete [] pre;# Q3 Q6 R8 i3 |2 X# X; D
}* G. F9 s: F/ N; \! Z6 q
int String:ength() const
5 T3 g) y4 ~7 k{" J! d, t# ?9 }
return size-1;7 F0 y# E( w2 D# z; c% X+ M; |8 D
}6 w* T( n$ q. {; n* T
int String::ReadString()+ E2 ^" N% Z, @
{2 |4 z! _. ]: }, x+ w0 }# r
char tmp[256];: c. g  g- e7 y& A' e
    if(in&gt;&gt;tmp)% r% j# f. g2 G9 x: `
{
9 b# s0 }! k- y2 @  V% w  delete [] str;
9 u. ~5 m" o3 z* M' |7 R1 w  size=strlen(tmp)+1;  ?6 w9 u7 I. Y( m& l& F9 M& c
  str=new char [size];) Y' C. }/ B3 L: j0 ?! L% o
  strcpy(str,tmp);, x6 n: F& j) [# r0 J/ r, G
  return size-1;, I# f4 J6 k, G2 R
}4 e  i  x2 |0 C5 W/ z
else8 u% F/ ~) F7 Y# j9 d
  return -1;
9 z! \6 F+ D0 _2 M7 s6 {: E8 J}$ ^4 A* S0 T3 z$ W
int String::Rs()' p& \5 M9 Y: Z5 G- ]
{& p1 R& l7 T  v5 H8 `" j+ C
char tmp[256],c;
) C9 l0 n9 T0 F' t0 N int i=0;
2 s6 W; F$ O* y8 t$ m while(in&gt;&gt;c)& |7 `0 [) N" H+ m' w8 ^7 r
{8 O& F/ d( M8 R  z  `' V
  if(c!='*')
) h* c# a. F1 b9 T! j! ^  tmp[i++]=c;# A( |1 T% g0 Z/ V3 b* J# q9 m
  else if(c=='*'&amp;&amp;i&gt;0)% K/ E! O& L3 I' Y( c+ e9 }
   break;
; l% v% ^8 ?% P9 O/ Y) ~  z4 @5 b }- p' b5 G3 }  X1 |
if(i&gt;0)
+ s8 x6 F+ M- `( M {
, ]5 H- X9 ~" n" g  A9 ^( g  delete [] str;/ I0 {* }$ r! w* G
  size=i+1;
2 R' G6 c5 o8 m  str=new char[size];0 `0 Z5 i. z9 e" V; w' q
  if(str==0)
+ X% h" O' Y9 H7 T( O2 _9 s   throw "error";
1 w) B3 U! `0 e6 S9 C  l  for(i=0;i&lt;size-1;i++)
: I  D2 E% P& f      str=tmp;  : Q3 G% f2 L/ n* V; d  ?: j: S
  return size-1;1 S3 V- T: \) p* q3 Q( D
}2 d3 Z! {0 j; l, D
else" k4 E) u! w! [8 e% @8 N# R
  return -1;
* l# @8 ^! o. i% O* d}
- s8 `3 V  _0 {6 n+ f1 ~, C' Rvoid String:refix()
9 G9 L- C0 w4 S; l{
7 i, A+ M0 i# {: j  [/ B int m=Length();
+ h8 _  L7 Y- x+ s delete [] pre;# m) D& p  i0 ~# U2 u" t1 p
pre=new int [m+1];& j- o4 P8 I) \( Y$ b4 ?9 ]" ]
pre[1]=0;# s5 H( H2 K3 C: H* y) C
int k=0;
/ p+ L# D" g, m5 U for(int i=2;i&lt;=m;i++)9 q$ `; }/ q) \5 G) |3 P$ p
{( l9 \) l( c' t" x! T/ _
  while((*(str+i-1)!=*(str+k))&amp;&amp;(k&gt;0))
& ], p/ _" A5 X) \. D% k   k=pre[k];
6 }, S: u* c) ?; J# |+ H         if(*(str+i-1)==*(str+k))
6 m( u% P& W- S6 Y% w) P* W    pre=++k;
# v1 c* J' p& j5 q   else! e% a1 }0 B6 z
    pre=0;4 S* z, [3 p* h% x- A
}
# P' x2 m7 _4 W6 e}+ ~" h/ M2 v' e$ @+ b- O* W% c
void String::ModifiedPrefix()
; D' b+ p" N/ x2 `{7 I2 U0 a% j/ g: L+ z- O7 W
int *f;/ w0 e0 |4 j" e  ]
int m=Length();  Y7 A. P; C  E! l$ U& |
f=new int[m+1];
* q$ \7 ?$ Y- G& H Prefix();
4 a& m; e8 S. _' P7 ]; j; m for(int i=1;i&lt;=m;i++)
) I* n/ R3 V) |! I+ M {
9 d; D( w- y6 R% b2 {/ {    f=pre;% |; o/ C& F5 O' ~7 Q  {& Y
}
+ T/ @4 `3 F/ k: F+ n( M( ^ for(i=1;i&lt;m;i++)/ g9 z# I4 o5 F
{/ W% z7 q. B3 u
  int k=f;. h& O4 Y1 Z0 s
  if((k==0)||(*(str+i)!=*(str+k)))
  q& R$ k5 H6 D# d   pre=k;  e( l* }! p& W8 v# U5 `, H
  else 5 u' t# z' N* o
   pre=pre[k];! t6 E: T. \6 ?9 ]$ Y; W: e+ T
}2 R' W0 i( j, k' y7 f! z
delete []f;
' J& p: y8 @1 c}
8 ?( x# d. n8 dint String::Match(int i,String&amp; t), t6 }2 r+ S# }- e
{, T! q, ~% M) @* e: V# p. c
int j=0;* \: {- K3 l) d1 |" |* t2 W/ h
int n=Length(),m=t.Length();$ O$ b  r; ~/ f$ ]0 h, a( r& m
t.ModifiedPrefix();) N- T- m0 H! E8 p# {* n( P
while((i&lt;=n)&amp;&amp;(j&lt;m))
8 a/ {) B! z) h  if(str[i-1]==t.str[j])
( P% x+ Z7 q0 @* G, Y! `  {
9 D1 }' i, a) n; H4 Z/ {) {   i++;
" R, ^9 W, u) I- ^/ Y   j++;
+ c) L% H7 I. ^  }2 |+ x7 f$ `& C( Z, p4 y* y; O
  else
1 ~8 d+ j- e1 `   if(j==0)- P/ r/ s9 c, `1 X, K# U/ P
        i++;% C/ b+ X  N; y, N' i
      else
* ?% u2 S3 f1 P4 d# g    j=t.pre[j];% A6 R- S+ D+ [/ C
  if(j&lt;m)
1 d; H: X( |" n: Q7 m/ n  \   return 0;
7 L' W$ D5 z2 [3 i7 }% F7 N  else / R' c' v5 j' M5 O+ a2 r( ^3 d
   return i-1;
. W7 y: T; L- `: I; u% B& K}8 x$ f% w6 D3 T0 E# y5 [" b
int main()
! ~" U. [2 q! ~) h) q{6 R! n, [3 ^6 L8 e3 s6 R- q( Y% K
if(in.fail())
, @7 j4 B2 |+ [7 {) { {
$ g2 G, K! i& Q# R$ u  cout&lt;&lt;"the input.txt is not exist!";2 K7 Q: \1 I+ x3 o% w0 }
  exit(1);}
7 Q3 M# M& J. I0 q8 H& K- W, @ int i=1;# _. R- N# \% `
String s,t;
4 J: g! B8 V5 Q" r s.ReadString();4 S, e" }. a- z
while(t.Rs()+1)
- f  [' E/ T; k* V1 Z1 u# C4 B2 \! x {
1 N/ l/ f, N% K6 L; F  i=s.Match(i,t);8 V# a  m! Y5 p# w2 `. w) B
  if(!i)
; L, f7 G" q) x9 w" A9 ?0 c( v2 O8 K  {
, Z$ p  E# c) ]6 a) h/ y3 I      out&lt;&lt;"No"&lt;&lt;endl;3 E& c8 c% ]* j. _  D+ H5 c/ C
   break;3 ]! W5 _+ Z+ p9 {4 H
  }- ]% f$ z" j" z$ _
}% H  C" _0 f* [  I+ r& F' \
if(i): `& Y. d4 Z9 ^. V9 z2 j
  out&lt;&lt;"Yes"&lt;&lt;endl;( }) r# D  w8 ^6 I
return 0;3 X2 {  Q/ X3 S/ D: B* T, t
}

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

    回顶部