QQ登录

只需要一步,快速开始

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

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

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

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P>
6 o& ~' m; _) d* U<>[
游客,如果您要查看本帖隐藏内容请回复
[/hide]</P>#include &lt;iostream&gt;& z! {% P  X8 q; {$ _7 S7 T
#include &lt;fstream&gt;; v; n! E6 \- b
using namespace std;7 P7 J) \; X1 P1 l2 y8 Y; L0 m
ifstream in("input.txt");1 Y. N3 i8 o3 \* }9 R
ofstream out("output.txt");
/ j& e' N/ C0 t+ _class String
0 W8 c  z7 O  k; \& |$ @{6 o" i6 t; ^  }' i( V& h  l
  public:
  w$ e! ^2 P9 a# |/ l* m String(char *s="");5 a+ {/ e  B0 y
String(const String&amp; s);
& ~- U; ?& B9 R/ S. B- o ~String();4 S' R4 U) o& ?( `' O. p
int Length() const;% o( L$ i* G/ [8 t& q8 x# V" z
int ReadString();
2 C: ?, F& Z5 ^) @ int Rs();' x5 {3 F1 \1 {) V9 h! D1 H& H6 H
void Prefix();
  C$ u( K7 u+ y) i% ~4 Y* u void ModifiedPrefix();
, Z* i9 I3 R# y9 S int Match(int i,String&amp; t);, [: u. S5 {7 j* P' v
  private:0 c0 h4 s; J( j" {* ~0 w
   char *str;. E, }7 m5 H8 u* l- N5 {* A# F
   int *pre;- _9 k* z# h8 e9 A( _
   int size;  r6 u- I( ]* [6 r
};4 ]- H  v( B7 z* {0 a
String::String(char *s)# L* c6 v( a( B
{6 ~8 z7 s) w) J* k. o6 R/ Q! `
size=strlen(s)+1;% O# M! H7 d: L& R% b5 _
str=new char[size];
% d7 n8 [0 {0 b/ k! z: U+ F if(str==0)
8 R1 f9 t$ _$ `% s  throw "error";8 s% T  ^  O; ]- A2 e8 p: V! z& R# I
strcpy(str,s);2 {2 \8 i& {# ]
pre=new int[size];
" e) V8 W8 D5 ~7 m$ R if(pre==0)
; d' t$ H: x! h5 n3 v) Z' y  throw "error";
. E5 D& x, R# i# T! z}$ P$ ^% u2 g( j7 f
String::String(const String&amp; s). r# w5 |# J; j6 L
{
) V* ?: c. W1 W) N* M4 j5 s9 s5 v size=s.size;# c9 c0 E! H4 v9 z( b; p
str=new char [size];' c/ u! X) i4 g: A3 i/ V
if(str==0)
. K2 b  x- _" p0 f/ k4 ]  throw "error";
- s+ |7 S3 _7 G) T) l5 j strcpy(str,s.str);) i" \1 y" N3 f  c& z- F
pre=new int [size];
+ I7 E, I& L$ j7 H4 W if(pre==0)
3 c- j, c  l- `; u$ _( B5 j  throw "error";. z& z1 q$ h; {% }" ~1 H
}
8 [2 ?# D7 J9 Y$ y4 U1 o9 aString::~String()( M( _6 ^) Q' i" Q
{, q: _% [6 f- j3 L8 o6 E* J
delete [] str;
$ b: {1 _$ w% W  N+ a! ] delete [] pre;
0 s. Y0 u8 Y3 z9 ]! U; i}
. w& `+ Z5 t3 H6 u" z1 J) U& I4 pint String:ength() const
& U& p" F2 o# p4 u) T. k. J% K{/ x6 i7 d* ?2 R- R% r9 k5 ]
return size-1;
/ D) M1 z* K" G3 H0 a2 {}
) f0 R0 U9 i; Q& M: h, a; m4 v& Mint String::ReadString()
3 o- \$ K5 |4 s/ g9 R" y/ }* i/ B{
" z3 Q/ g: V; @0 G char tmp[256];; j$ A; i. p& c& R8 u
    if(in&gt;&gt;tmp): w* m# O6 q& S* l3 `
{
1 h8 @# l- m: W3 p% g7 K& z  delete [] str;2 J/ I$ c9 r; I4 g& W2 X8 H
  size=strlen(tmp)+1;) o: e+ n% e% ~& {7 r/ s0 Q  f
  str=new char [size];# y% t& \7 P6 t' _* M% o/ m
  strcpy(str,tmp);
6 T) ^. e' X( m* f0 S  return size-1;
) C+ X/ a* E& Q' u2 r. `) f% B2 W }9 _& p8 N+ i) [2 U
else) ^3 M% m' }# _4 h# z% }
  return -1;
0 p. Y& l. U. j8 H$ x" R4 |}0 R- v- J. c  Q
int String::Rs()
$ H; H: m: K; }* m4 d5 I{9 Q4 Q# H  k0 y+ H. A% v
char tmp[256],c;+ G2 ?% Z2 s( g; }; w  X  m4 X0 l; L
int i=0;
0 w1 j9 v3 \7 p+ @+ j* K0 w8 X while(in&gt;&gt;c)
) R/ ]1 d$ i2 P: p0 h4 B& y {
2 b  H' J3 f# B0 V  if(c!='*')
# t. c3 D4 C  u1 k0 o' [- Q3 B: x  tmp[i++]=c;6 g/ ]  W& {' W8 }$ y7 s8 F
  else if(c=='*'&amp;&amp;i&gt;0)6 `3 K* b6 l# T
   break;
- r7 l1 s7 |. L: N2 y( A }% `% n$ h5 w+ u) h; z5 `
if(i&gt;0)
3 _2 T! l' H* y: P+ O1 \ {
2 P2 s6 L$ m6 O! w' c$ i1 W0 ~  delete [] str;. A/ Z2 |+ b0 x& l1 y
  size=i+1;) b4 A9 F: h8 I
  str=new char[size];
# u- Z# Q  ^- |) _0 c1 F; n: G  if(str==0)
9 a- O" _; f' D4 x/ B   throw "error";5 p* m. }6 J7 v2 t) O' J; w
  for(i=0;i&lt;size-1;i++)) z3 U& q3 `; r8 n' C: b  [5 i
      str=tmp;  5 J" C  S" s. Y) t
  return size-1;- i4 A% r: t6 u3 r# ^& s
}
& g* C* L2 a) K% ~8 C2 m5 | else6 N/ N& b' N( G, E  T: k' x
  return -1;
) e# x# X3 J" p4 ^* G: y$ L}& n  \9 ^+ \+ _3 U5 Z
void String:refix()/ O5 a- F! p( v, r
{
9 i5 A, q* t* F# T# P  F int m=Length();& @: S+ q  I; a7 A. e1 r
delete [] pre;
5 i/ i$ {/ ~# l6 H7 p# r" ^ pre=new int [m+1];
  R( K2 V) \" B$ _, f pre[1]=0;/ c, n  z. B7 e3 H5 v
int k=0;3 D# I( g: T+ B6 N! Y* t
for(int i=2;i&lt;=m;i++)
, e7 Y( s5 k3 l: ^$ s {
. p$ b/ e$ E" x" r8 w% i7 d! v  while((*(str+i-1)!=*(str+k))&amp;&amp;(k&gt;0))
  n% j5 h6 e2 R7 ^1 L   k=pre[k];
; ~) h& Z0 c# g6 s6 H         if(*(str+i-1)==*(str+k))
5 l% K- G; j( w, y; E, @5 S    pre=++k;0 n3 Y) k7 k+ L- m0 Y) O
   else
% O/ B. U3 p: [3 J    pre=0;
. a+ b, v4 N- x2 s2 p }% u7 t2 J6 C# [( o# [
}- y  f( z$ A: g" Y7 n7 t  G
void String::ModifiedPrefix()1 r1 _1 n* G0 w
{7 I. \3 x$ X1 Z# ^) w$ {
int *f;' v" E7 S6 p$ V( _9 J
int m=Length();0 ?1 {+ S) D) \$ Z; d2 b6 ^: x" y, J' F" u
f=new int[m+1];
3 `! L" _1 S) M: D$ m Prefix();6 R* J% T5 U2 S- B1 R+ U
for(int i=1;i&lt;=m;i++)3 Y( S$ @3 Y; L8 e
{- R- l# \( Y! t6 U5 `3 X2 P
    f=pre;7 S5 g# ~" R. b
}1 H( F# ^0 B5 U$ |9 g8 p
for(i=1;i&lt;m;i++)
# G- U* v% f9 Q' @8 F# y6 H {9 Q* z8 _" `* b4 ?( R* Y
  int k=f;
& l  w$ Q% {/ A. F2 W  if((k==0)||(*(str+i)!=*(str+k)))9 T4 k; `0 a9 f+ _# T; \2 M
   pre=k;7 m$ P/ o3 H* G( t- i4 X& _8 D$ d- X
  else
2 j: I7 m1 K; M+ i* h8 E   pre=pre[k];0 ^+ E2 W9 Z" b# H- }" k+ O% u
}" a& g' H* `: A5 A3 l
delete []f;
  x$ ^' A& q/ {" B/ x2 a/ q1 Z}; q% p0 n6 Q# v/ I( g( E; v3 T
int String::Match(int i,String&amp; t)
; i& l6 Q1 S8 f. a, g0 Y6 R{( B/ V/ e; V# s$ m8 l9 I# e- X) B
int j=0;9 B( n$ n2 o& K" Q& E/ J
int n=Length(),m=t.Length();
2 L  v; g# t9 r, ^; j8 ~ t.ModifiedPrefix();
) t! m* V1 `9 X5 |3 j while((i&lt;=n)&amp;&amp;(j&lt;m))$ f' V6 c  M$ A. ^
  if(str[i-1]==t.str[j])# I5 A  [& E& b! K; v3 D  Q
  {
! t! @+ P# Y7 y- Q0 C& P   i++;
2 P1 S! o/ x& A. f: H) C   j++;
4 G. X$ ?" V, i2 j* H7 F  }$ o$ s) ?; @" U# P' U
  else & ~# R+ P& C2 _  h8 H  k4 x( l
   if(j==0)
/ V% b# [& r2 u. N' G# b0 p        i++;
. x. u5 i6 P$ R: S& a2 H5 Z      else
2 d. b! I% {8 a1 w/ b    j=t.pre[j];0 `  V, L! X; T
  if(j&lt;m)6 ?  e% P9 o$ @
   return 0;9 j* i( I, D, a' K1 {
  else 0 p. H8 G, D- u% p' V; F2 ?7 q
   return i-1;1 W9 h' l* ]( ~8 q$ _! Y3 m
}7 ?" m( S& I" K1 C2 [
int main(). n$ Y$ n1 m0 W6 b( L1 L9 D
{8 X6 V; z+ n! Z% K6 f
if(in.fail())6 W2 i$ \3 _2 v2 ~1 Q4 L' g
{
" t8 J: A. O% ]0 S/ o: j  cout&lt;&lt;"the input.txt is not exist!";
2 A7 i+ ~5 J# Z( K  exit(1);}$ b* R( L# c, J4 D& z: P
int i=1;1 @' X$ }. R4 a+ j8 h  _; h
String s,t;
) d$ P& u( c( G7 J5 e6 ]" j s.ReadString();& ^. {$ w3 M1 }6 c5 Z% }
while(t.Rs()+1)1 b4 `9 w" l' w! H
{% C  g7 d+ b: g' Q/ j& N, m4 E( w
  i=s.Match(i,t);$ w7 j/ {, p7 w( U* H
  if(!i)8 ]2 E( D; K; L) [. K  \
  {
9 J3 ?# K& d) n# x, |/ m! ~$ }      out&lt;&lt;"No"&lt;&lt;endl;
; p& E- B7 G* |   break;
. k. ^- L9 ]! ]' G/ p( {  }& e. ?. J; U) O
}* l4 @0 x1 k# o2 F# B0 x6 r$ q
if(i)
8 k/ J- N6 b3 F8 C9 A' K; v9 ?  out&lt;&lt;"Yes"&lt;&lt;endl;
4 Z, m5 u* q$ l4 k$ Z) y2 J& b7 ~ return 0;
* y, T4 s9 L  C) y! m}

间隙字符串匹配问题(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, 2024-4-28 15:44 , Processed in 0.518449 second(s), 89 queries .

    回顶部