QQ登录

只需要一步,快速开始

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

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

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

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P>
+ T/ j. B( X; d  g' j3 @<>[
游客,如果您要查看本帖隐藏内容请回复
[/hide]</P>#include &lt;iostream&gt;, w  p; q4 U/ A* c5 i* a9 J; i( R! V
#include &lt;fstream&gt;$ |7 W' I! N! g( [8 _
using namespace std;% Y3 J  Z2 |" R$ @+ [  A
ifstream in("input.txt");
5 R, B! ]% _* Xofstream out("output.txt");" y/ Z; R, H* I9 |/ j# ?7 o& M
class String" I$ q# X7 L6 R& s- G
{; v  _6 j9 j- U" J' F- k
  public:
# {" r/ y/ ?6 S7 t6 C String(char *s="");4 p$ _9 C5 M% |
String(const String&amp; s);+ `; ~6 H# N, o& d# p- _
~String();
% ~, t% d7 s3 j6 ~7 x  ?- ^' E int Length() const;  T* L, {2 p9 D& J8 T0 |' L% l
int ReadString();& x/ V3 r( V! k; U
int Rs();0 c8 @$ \( |0 r- J
void Prefix();# a. a; C2 P' X9 s0 A2 \% X+ m
void ModifiedPrefix();
+ _& v$ h9 V) K1 {2 W int Match(int i,String&amp; t);8 L% y" ]" U0 p( v% H. n  w5 p
  private:8 l  A* P1 ~+ v2 P  z! L
   char *str;
. w/ m, [- F, \& e8 C0 `4 w/ S5 L   int *pre;
- b+ p+ Q) z! v   int size;% Y- e4 J# Y3 f$ V/ \( e$ R. h& T4 e
};4 I: y4 j$ L4 F. c  U
String::String(char *s)/ v& K. d) Z3 ?
{
6 v! _9 z; |, C size=strlen(s)+1;/ y1 m+ e* H; [3 W( P
str=new char[size];" z2 d+ K& J# ?& a  f
if(str==0)
* j( L+ x' q0 K6 O  M  throw "error";
/ V7 `* n9 h) M1 c strcpy(str,s);; J$ F; F, K$ Y; c! c
pre=new int[size];
: ]3 A$ |* |2 C5 j' C if(pre==0)
& s: n7 |) u6 Q$ N  throw "error";
: B2 ^/ w" Y1 P9 B1 t1 n7 f: i; V}0 @8 I: Q6 L$ {, M( P
String::String(const String&amp; s)
! D; z  p& w$ V, j' g- C{
( k) [4 h. _; b* F8 W1 ~" ~; \. I size=s.size;
/ c9 S0 R. H2 O( ^9 b str=new char [size];
; i8 E* i2 l  _" @: @7 {% m if(str==0)
# `9 d  U" ~, o. ?! m2 ]7 {  throw "error";; _8 `* K! ~5 ]+ ]) A7 h
strcpy(str,s.str);2 X" i- `9 f, R* h* B: u; o
pre=new int [size];
# v2 M+ L) ^1 n, Z3 I9 { if(pre==0)
$ A2 \# Q5 U% H; a) j7 g  throw "error";3 T- i( ]  N/ r$ z
}
8 S: f/ M& X. h& ~String::~String()
! H& b5 ~3 t2 I{7 V8 s1 u' h- ~2 ~# N6 x# b
delete [] str;
% t* R% l. [& T* A delete [] pre;
& w$ C' t) F  j+ H; w}
6 X! [& B6 s, }# ]: S0 K/ m3 Cint String:ength() const2 D1 n2 w/ q" N2 m" A
{7 v7 Y  Z. c2 ]3 ~& i$ X& ^
return size-1;  c" D  S: T8 {, A
}: r3 A, c4 \6 a- u- b5 I5 Y( D
int String::ReadString()
$ q( R. q4 R3 u4 z0 \) Z/ j{
  n! J# C- S& b- P char tmp[256];! s, P8 k' Z% `* z1 s
    if(in&gt;&gt;tmp)4 C  D8 T9 F/ i5 j/ ^% V$ O
{
' P, `- z4 a* q0 f  delete [] str;
/ W1 Y. h; |) C( c, p4 T- F9 O  size=strlen(tmp)+1;
- p/ p  ~+ X- K' J- Q2 [! ^  str=new char [size];/ S; |% m6 Z5 p5 a, }% `0 T$ d2 C
  strcpy(str,tmp);
' ~9 f& A0 ~, L# L  return size-1;
6 r0 M, E7 C# s, c( m, Y) N4 O# o9 J2 M }
7 K- h; j" T7 u4 a. ?$ W. N5 H else1 |& D8 i/ [& x, C
  return -1;
9 [% f, {- I0 ?" l4 d}
' Z) r- K. X- a0 g) h9 Nint String::Rs()& V/ h( r% V/ O( \( _3 x
{. e4 m- W* E" L
char tmp[256],c;
( ?' L( s, k7 Q int i=0;
- {8 v- k7 X! y& y+ }/ T& } while(in&gt;&gt;c)
3 \/ k4 P2 L9 p {' K: H5 W) Y. B
  if(c!='*')  z  k9 s4 D% o9 c: Y
  tmp[i++]=c;
# S4 y3 i! X. S3 |5 R4 b  else if(c=='*'&amp;&amp;i&gt;0)
8 R' R# b0 S9 v! H, H# _7 N$ Q   break;  X4 H9 M/ N/ s# Y
}
# g& A+ j# w$ w+ G# y- o3 G if(i&gt;0)
, h" Y: X  v( e. t1 s& f* J {
! U/ H- l1 r! H  delete [] str;- x: O- ]! ]* ]" \& K8 e0 [
  size=i+1;# ]" D7 k  y9 T8 f  S  N7 t
  str=new char[size];$ C/ \2 }- A3 P
  if(str==0)5 u% A$ @4 M# R* H3 J
   throw "error";0 _2 u+ N' @( ^; D9 |
  for(i=0;i&lt;size-1;i++)# h" W# H3 C) k+ F
      str=tmp;  
+ Q6 j$ P( q* b. q: D  return size-1;) P6 s- f" n1 ?3 V' y
}
1 }8 M5 R. ?7 `8 r; V else
2 ]+ x6 F& z2 ?7 P  return -1;+ |+ o3 A4 `' {; N5 v, H, I: K' ?3 o
}7 n- w; X) f/ M4 x" J: R+ |) l
void String:refix()- h2 ~1 g  S- h: `" q$ ]
{8 Q' y8 b; L7 [; I4 |
int m=Length();
% K, W' [/ {- |  t. M$ n delete [] pre;
. y& m  C3 t4 _- G6 F pre=new int [m+1];
, T5 b4 o/ e, k/ R pre[1]=0;
2 o, r3 s% V& ]7 t5 q int k=0;
/ ?( k1 r9 i& Z* L  V for(int i=2;i&lt;=m;i++)+ a2 C4 _! n; Q2 a2 g
{/ v/ Q% `. Y! r0 e
  while((*(str+i-1)!=*(str+k))&amp;&amp;(k&gt;0))
; w& N' l$ }2 u8 _% m   k=pre[k];+ R, E& C1 y) A
         if(*(str+i-1)==*(str+k))% ^$ r2 p; \6 ~" S: Y# r
    pre=++k;, P% B7 J. \  g% O+ V" i1 ^
   else* k' D: c6 c" f6 H5 h1 r
    pre=0;* K+ _( j! y2 ]$ Q
}" S6 H" @# s, `3 A
}) D) _( e; R6 b- g# ]1 m( i
void String::ModifiedPrefix()
7 A  E9 Y2 T; z9 |{1 q! {3 `1 H% {
int *f;4 b1 [/ y+ o; t5 k& k& x
int m=Length();
% y* q$ Z2 S  }4 X- t f=new int[m+1];
6 k7 L  M3 K  s. a$ k Prefix();0 j; ~5 k* ^+ y  J
for(int i=1;i&lt;=m;i++)
1 f% ?8 E: `) U {
% ^: E  W% r$ y" I    f=pre;0 S3 E+ @4 y; ?7 B+ K2 K
}
' p1 `4 O9 o- H for(i=1;i&lt;m;i++)4 j. T" W1 @- l7 j; a2 V
{
% M8 Q9 h& t' l- g" m- V; A  int k=f;
" z' a4 ~0 I$ y  e* [  if((k==0)||(*(str+i)!=*(str+k)))  U, k  Q  t9 S4 A! ?! A0 T$ S9 j
   pre=k;% v/ i4 q8 B* I, g! G3 H2 U/ g
  else
0 ~8 X7 S( ]* p$ [' V7 y, y   pre=pre[k];7 _: R$ l" Y# q' }% m
}
$ D3 q4 o- l& Q  \2 P0 G, p delete []f;: o! I" x' J' ]/ d
}
- m  g$ `% m# `( m7 W  w' Nint String::Match(int i,String&amp; t)8 W$ p9 e( o6 z9 L  w
{
) v# k8 b4 }# d, u8 r  f int j=0;% l) g- E' z4 w
int n=Length(),m=t.Length();  W% A& q% s% S& Q
t.ModifiedPrefix();. x7 d. f+ }+ \% h, s2 M6 W8 u
while((i&lt;=n)&amp;&amp;(j&lt;m))
. I. e& q2 Z3 n. A  if(str[i-1]==t.str[j])! c( n& B1 k. X$ f* Q& E; D9 D% P
  {5 @; b3 b. W7 X
   i++;
* x' x) M2 _% e- ^  S! Q1 O   j++;
5 @! F* e# |8 N. O  }0 D' c( y6 x; v! U& R. `) A
  else
+ x) _3 K! }- n/ {& g3 M9 n9 F   if(j==0)0 u- }- {5 x* o7 N+ x& r- d& u
        i++;& \+ p9 W$ h' ~2 W! O4 i) b! u+ n2 d
      else - ?% Q& l# q8 V9 y$ z% q- }* x
    j=t.pre[j];
* }8 w$ X! _! h& ^- \. u  B  @2 B  if(j&lt;m)
) e, y9 Z- A: I( i. H+ `( r1 s* H, _1 p   return 0;
+ V6 b- Y% W5 E% d8 X+ j# C  else
8 ~" @1 Y3 v! Q: b: P0 E$ m   return i-1;
, Q+ u% }" {& ?" _; b, U/ w& z}
4 t  y$ m4 F5 J7 e/ J' pint main()
, h* O+ H/ Z( A* s$ c6 z& h/ B. O{
1 s! ]  S. ^1 d: R/ X if(in.fail())
; Y6 e4 _& T3 n1 ^/ [3 o3 e# h {3 L% t/ W* D6 s& s9 k2 H7 \
  cout&lt;&lt;"the input.txt is not exist!";
; b. N/ a4 L; `6 r) p! E4 ?  exit(1);}
% Y2 w; V- K6 g" A) h$ o1 I8 p int i=1;7 K5 ]( {* t2 f
String s,t;
$ P/ l/ ^: K# e/ G6 c8 ]  d( P8 D* x s.ReadString();: ^% w# O  E0 N4 _4 M
while(t.Rs()+1)
* v6 V2 |2 j% v! i. t {
1 Z: I. m- d! [2 `  i=s.Match(i,t);
- z( ~0 K& m7 M+ U& d  if(!i)
& l# ^7 D) h* g; ^# n/ H  R  {$ F0 P9 C& i% b" C
      out&lt;&lt;"No"&lt;&lt;endl;
+ r! E; w) N7 g; m+ P* }   break;
6 u/ Q% r' [; x+ `# Y  }  p# `# e3 \5 k# P7 ^+ K2 t
}
& U5 U' Z' ?. H; r if(i)
; S& s! l: [  ~& c+ u  out&lt;&lt;"Yes"&lt;&lt;endl;4 c8 H- H) q/ t9 n: g' Z, ~
return 0;
# a5 R/ h3 }4 X* f8 P1 P- U- 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, 2026-6-3 21:29 , Processed in 0.521862 second(s), 90 queries .

    回顶部