QQ登录

只需要一步,快速开始

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

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

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

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P>
4 q* k2 S* @) Y' p2 N<>[
游客,如果您要查看本帖隐藏内容请回复
[/hide]</P>#include &lt;iostream&gt;3 @- `7 ~( O% j" c: C! n
#include &lt;fstream&gt;
* Z: C& v, [; C0 c3 P& ^' N/ fusing namespace std;
7 e- d2 M/ g) H2 i1 Vifstream in("input.txt");  X$ P& P( s, \* _9 s0 }1 b2 e
ofstream out("output.txt");% s3 P; K0 r3 x  G: o; l
class String
! Q9 h8 ]5 a; `% K8 C/ ]1 W{
5 ~! E/ R% L  `+ t# B1 ^  public:
3 C3 M% u& N6 L String(char *s="");
, H8 f) r8 Y+ h; I String(const String&amp; s);. w9 |8 |# n3 S. V3 M; _
~String();
# t4 G0 W6 G/ n: d7 V0 n int Length() const;, U4 H" [5 k0 x
int ReadString();, j1 F% q9 y- v2 H6 a9 U' p% J
int Rs();+ L" n: |% \- J
void Prefix();
! W& ]; F* E3 P7 A1 \ void ModifiedPrefix();
0 _' p2 A5 I5 j% a# Y0 \9 u int Match(int i,String&amp; t);
+ w+ }, L" J" C) H$ L  private:
+ [* [* f0 H! f+ }- Z# R   char *str;
) w5 _" p& B+ h  |' s   int *pre;
- n% A4 x) B5 L4 r0 R7 s5 H   int size;. r' d8 w$ t7 A% q2 \. c8 H
};' O1 R) H& g: {$ f
String::String(char *s)5 M8 O' {4 [# G/ v4 E; S
{3 X! R, W, ]# e( d4 z3 t, A: T
size=strlen(s)+1;
2 a# m! J0 ~. b str=new char[size];4 y9 F$ Z' j! u$ ?( \9 z0 K1 E
if(str==0)
% b$ b5 l( @6 |7 C9 _, h; @. P  throw "error";
; {4 }% F8 L/ V& p! M3 P& B strcpy(str,s);
! R/ G5 _# F2 D pre=new int[size];
& H8 v, Q8 q3 I( P( \ if(pre==0)
, B( s# f/ g5 }5 i) q$ c2 |  throw "error";
( e) n+ [0 H9 V6 s# i/ y}5 h0 o  t5 U5 v. R- [' t
String::String(const String&amp; s)
1 F4 Q6 X/ b* A& _$ y{
4 d4 @7 I8 Q, A6 O size=s.size;
! h1 \8 f3 A5 x  a% S# M4 F9 r& J str=new char [size];
( O4 n( D1 X/ L& K+ X  d( O4 ^ if(str==0), M# I9 j8 ~% R/ J7 K) J/ E
  throw "error";
5 r4 d3 O4 ^! `3 U0 m strcpy(str,s.str);
& @. n6 M0 v( [: @& a pre=new int [size];
. Y  t  }. _" _ if(pre==0); k6 U4 P7 p# ?& \
  throw "error";
  S1 n  A( h! u/ R8 R# {8 p! d" ^}
7 c, }& m; u# u0 M# o% _- PString::~String()
1 _9 s5 W) \; [, M6 R0 {{* n% G. v6 D' g# ?4 [# \
delete [] str;9 R1 O* F* P" l# i# F1 Y, c
delete [] pre;
& d+ {* T1 w3 o3 t" `0 |) O( q, _}" ^+ L! J2 a- E% s" `
int String:ength() const; ]2 f+ r, y+ g/ x: s
{6 S% O: |8 Z9 i" y: O. t
return size-1;
1 f6 S) h: T5 n" O}* o' a* o% R! q
int String::ReadString()
  W/ k6 S7 W: F8 m{. v# c5 F; H  D3 q+ z, K3 F
char tmp[256];
! s) H, l/ \; a( \# S5 {! \0 o    if(in&gt;&gt;tmp)
. }: i7 _+ h% v2 g9 \  q {
+ F; j! U8 f) l) ?6 h  delete [] str;
0 c7 c/ w8 I: Z/ o2 @  size=strlen(tmp)+1;; G, c, U. C( h! f3 n& p
  str=new char [size];
' J& o8 W7 f% ~  strcpy(str,tmp);
, i- C  d. y5 t2 H  return size-1;1 }" r; R0 P7 Z
}
9 f- W. K. N& f/ j) | else
" Z- f$ ~' F# d5 |  return -1;  I/ i  E8 h/ v- \# }
}6 m) A6 C" l( ^( J6 N
int String::Rs()3 y* Q8 m. g' ]8 X/ H- ~
{+ b( b3 _2 A# y8 |. i' g4 S/ y
char tmp[256],c;; L6 M/ p; p4 Q( H6 f3 Y
int i=0;
- z9 H7 [* Z8 _9 q/ C while(in&gt;&gt;c)  t& X2 O! l! p; }7 a
{
& z3 }/ e: ]0 R* q  if(c!='*')2 \+ o9 I8 E7 G; q$ U6 F* D
  tmp[i++]=c;
9 a& n8 l- n2 u5 g, o  else if(c=='*'&amp;&amp;i&gt;0)
  I0 q- y) j* \( C' j   break;
& d$ U# ~2 T, @" @ }
, n7 n& Z" B1 {) r: ]. @ if(i&gt;0)2 P/ h" J  d, P: j' j% K. ?8 k& o
{, U4 K1 \: e& N  N" {5 f  G; v
  delete [] str;$ m0 q) G7 K! ^% e5 o" `8 X  |
  size=i+1;- O3 J9 f6 p: {5 t% C
  str=new char[size];
, f' S/ {/ G4 I* L: ^  if(str==0)# j* I6 v% {# J2 `  j
   throw "error";
! V+ E( e/ V& \" F' q. r! u  v  for(i=0;i&lt;size-1;i++)
+ e/ A% k: w0 O9 h5 D' u& z      str=tmp;  $ X1 T% q( A4 U- j, D3 p: {+ K9 d
  return size-1;
) _" u' T' ]" f* R0 b! V0 T! h3 \ }
$ t$ ^' ]5 T! F8 w' M# `! ~6 }/ B. A else( U( d" z, D1 n" G5 t2 j
  return -1;
  \& M) \2 s( A' b}
5 F$ n/ _& T: C3 V; M% T, p" Hvoid String:refix()6 @% v. T. T' D9 M5 [; V# U
{
  [1 o" O2 U$ A: c3 n: w int m=Length();4 w% u1 a* t, b) n
delete [] pre;* g. G: M% K8 K* P+ t
pre=new int [m+1];
8 Y, l2 w0 m& c/ I2 r4 |7 n; k+ w pre[1]=0;- J1 `% A( s+ j9 Q6 q
int k=0;. f* ^1 R+ p' c; o% t: z+ c
for(int i=2;i&lt;=m;i++)
' s! I3 f0 ?, B3 v( o% H* E {( Y0 R% t! \3 U/ Z$ i) q
  while((*(str+i-1)!=*(str+k))&amp;&amp;(k&gt;0))
* ]" d& S, d  @- a9 D   k=pre[k];1 J# `8 T4 Q5 E+ @2 B
         if(*(str+i-1)==*(str+k))6 v) ^0 }$ M$ O' w5 m( f
    pre=++k;8 T; e  O3 o% V- v0 j
   else
9 S4 i: X; {2 \# w# n. d$ \    pre=0;8 o3 ~+ A# p3 d( v% u) D
}- J6 @* H4 ^1 ^8 Y
}- k/ {, I: M, [4 u
void String::ModifiedPrefix(): L) l8 b2 S  _9 a) I. `' M
{
# O5 }0 a/ l. X4 I: s- i; b int *f;
% r8 u- Q$ F& ]7 E int m=Length();* Q* Q0 I  r9 \: S$ W5 Q4 W
f=new int[m+1];
2 k3 f" s2 A5 h) R Prefix();  o5 O" t2 @6 n0 F5 I# H. q
for(int i=1;i&lt;=m;i++)+ @! `  u; O7 W$ E  q
{# v5 a: Q* V: l. S- ]# Q
    f=pre;/ e; ]$ u: f# Y# R
}
1 ~  ?0 U7 E2 `! U  W9 Y for(i=1;i&lt;m;i++)
9 ?5 w, o8 w4 [9 c4 N/ T; c {
5 L  Z# p* H" q; Y, F  int k=f;
; k8 F+ e: o4 y3 q  if((k==0)||(*(str+i)!=*(str+k)))
9 @1 d& I. J4 C+ h) k   pre=k;
9 w9 n/ j1 `2 t) h  else 7 w% w; b1 {, D- I" {4 e6 r* u
   pre=pre[k];/ P% f& p( {0 G/ W+ b
}
0 B+ o7 P- h# D4 X: z% i! v delete []f;
  e/ ]: {. F" h* s7 b, i" @}
1 C! ^" d" N8 [+ `' C7 ^) ], }int String::Match(int i,String&amp; t)
; _+ B& Z& g, A" w$ B! M{
. Z# t8 J7 |9 R) X1 R" t int j=0;
) {/ G% y) }9 u5 g. {' ] int n=Length(),m=t.Length();
; u8 m  i, \( O  B% h8 z$ N t.ModifiedPrefix();
3 r. I: K7 F6 A6 k8 b while((i&lt;=n)&amp;&amp;(j&lt;m))6 i. q1 r+ ~0 c, O) s5 A/ Y
  if(str[i-1]==t.str[j]): [8 o: c, S( S8 }* W+ }6 h. P
  {+ y" ], X0 a, G2 E2 w, Z
   i++;+ p/ \; _. {. I) [, I* k2 l
   j++;
6 G; {. k+ a7 m* {0 C4 ^7 C  }
7 Y! S; ^- d; M9 M! Q* ^: u  else
3 \4 z) U  J7 c4 }   if(j==0)7 }. _4 w0 c9 b8 I: o
        i++;% p5 j. b' |' o/ W; ~2 x* p2 I
      else
8 h) M( O1 a% M- _5 m( P    j=t.pre[j];6 v5 C) e/ P# v/ P
  if(j&lt;m)5 @# Y: R9 S4 v, J4 q. F4 r
   return 0;
: n% L, H1 P8 L  else
( Y4 W8 Y9 Y4 x$ ]" j   return i-1;
9 }7 N' ~1 ~, I/ U- \4 ^* W& }}( f' z4 H7 m1 V5 W, E* Z
int main()
% d# N, v8 H& ?0 k{5 A0 i3 C3 M& y0 @! w- s4 {- K- \# S
if(in.fail())
$ O0 T2 E! J8 C$ g5 m9 l {
; u8 f: D: F; u* J+ Q& U) G* i  cout&lt;&lt;"the input.txt is not exist!";
' p6 h6 k% K0 m  exit(1);}
7 E+ K1 n7 k" z* o: v6 P int i=1;
8 S) y# P' H. }" ^4 \ String s,t;
3 k" g  N* w& E! l s.ReadString();
0 H# d4 C" R- _6 |! c# n while(t.Rs()+1)
9 R/ j  `' x9 ?4 e1 w/ x {" Y& P/ y  [4 M+ i/ h# \1 H  o
  i=s.Match(i,t);1 @+ O; J! m5 ]; I' i; E: h, Q: x3 e
  if(!i)
" O* c4 S: r8 J6 F  J  {
. w" Y3 y! ]2 v0 t5 Y. g      out&lt;&lt;"No"&lt;&lt;endl;! v7 p7 A+ T- ^( T& ?0 I: F& N
   break;* ^, j1 h# R3 \) o* P$ M
  }
0 G# y" V" B0 \3 U: i, M0 R* k }
: i+ z# Z  ^/ ? if(i)
: C; a+ s  `% R% Z  out&lt;&lt;"Yes"&lt;&lt;endl;
0 ~+ w5 k+ e% u" D0 I- p. ^ return 0;
. f" c/ u* k: P3 |( R}

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

    回顶部