QQ登录

只需要一步,快速开始

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

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

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

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P>
+ y, g2 l% v' R<>[
游客,如果您要查看本帖隐藏内容请回复
[/hide]</P>#include &lt;iostream&gt;
! P/ b$ N3 m9 R% W, G" q$ b; m#include &lt;fstream&gt;
9 J5 D, z7 `3 A2 Q$ W" N) `using namespace std;
* Z0 S7 Z1 x8 hifstream in("input.txt");" {6 Z6 x. [$ b3 M
ofstream out("output.txt");
  d, [. C0 @7 O! Z* [class String, L1 ]0 O- x: S4 S% j
{
! J6 k4 w3 R+ _" A  public:8 n& R8 L, _$ w' L9 |' T, D
String(char *s="");
# m/ y; `, v" P7 e String(const String&amp; s);
/ P; [; l; V, n& H8 B& R' k1 m; n ~String();3 b, `- [" I& P
int Length() const;
1 p: P% a" H2 I2 N$ s int ReadString();5 b! `1 A  S# S0 k+ s
int Rs();% l2 S% e' N2 c# l) Z5 `0 C% k
void Prefix();$ q. n9 p+ ]; ]5 r9 v0 X9 X
void ModifiedPrefix();
  T7 O9 h" K7 r& T int Match(int i,String&amp; t);
: D+ i  A4 F. W' A1 P1 P7 y% i  private:# b& t: d: {0 T! C
   char *str;/ E. X+ p! E% P9 y3 l( ~; u  {
   int *pre;7 `" c) {  w+ B" C/ }% C
   int size;
# G" W$ Z( L2 p; N4 V8 U1 r) w};
' o- V7 v* Z$ H4 l2 tString::String(char *s)
) n5 E3 d6 t4 ]{7 G# k. X0 c# h( L6 a8 P; n
size=strlen(s)+1;' v- K$ U8 [7 q- C$ Y
str=new char[size];+ t3 K# X* |8 d- T) V- Q
if(str==0)
8 [) `. N; O3 j% z  throw "error";
+ T" R; d7 N5 ~# o4 K8 e2 D% R strcpy(str,s);8 }& K1 x- n9 [. Y
pre=new int[size];
/ v' M, {$ b: W if(pre==0)' C% V  J4 W5 I5 h( b; {
  throw "error";
$ n( g, G; y0 H, A% K9 r7 G8 }: z}
% z# c" A% D* F' VString::String(const String&amp; s)
- O9 i6 j9 L- L+ u7 W% s$ l{) K4 @9 ~; j4 X9 e5 ~% v; a
size=s.size;1 b$ R: s8 ]- }
str=new char [size];3 p  @  V) j" q
if(str==0)1 B  T/ T% u& ~* V  v4 ~; w
  throw "error";
  L2 D2 ?- J4 j# r! O' ?0 z strcpy(str,s.str);: c4 @  }0 J; O0 S
pre=new int [size];. j/ }% @3 P, l# ^, i3 [
if(pre==0)) l  u# s% W/ P! V$ t! n! t
  throw "error";
' u) a$ z5 S+ {) A! ?2 v  v}
9 ?; c( C" l* t% }String::~String()
0 h6 y& \+ t5 j. ?1 e7 @/ Q# S{; S  f9 Y% D/ Y4 m. p: O9 G7 j
delete [] str;
" `% X' F2 P9 l5 Z8 ~ delete [] pre;" ]+ j* U4 S: I4 k* R" L( S5 S
}
/ a9 O7 T$ p$ oint String:ength() const
! s5 `7 Y. ^+ r{
6 y# w2 I5 n# a0 c( D% f, @ return size-1;
0 b$ q' z5 J' f( O$ I  u% \}
# y5 j: @+ Q+ I# _/ I6 H( Sint String::ReadString()
4 M/ g* [2 G5 h0 K3 R- \0 i{1 k: B  I! y0 ~' S% v; ^& N# C" ^  D
char tmp[256];
( ^! y0 w- S6 U' \8 l. j- _! ~5 \    if(in&gt;&gt;tmp)1 }3 r3 h" a2 {' J
{
# M/ ~/ B1 ~0 _$ G" d% W% L  delete [] str;3 q, i9 }3 x* q+ N9 W5 e' r3 j
  size=strlen(tmp)+1;
0 {+ w- Q+ t* J) ~# q  str=new char [size];
$ w+ {) s1 Z8 D. k  strcpy(str,tmp);
1 T- n1 N1 B+ U  return size-1;
4 A% ~; _0 ]7 N! t; w, H }
. t& ^  D& L/ y6 G$ ]+ D else
+ e7 F1 u+ m  A8 u5 b7 d3 Y) i  return -1;
- o# ?! Y! D# G" p}
' j/ o% u: B# s; Mint String::Rs()
: S; V2 w0 B* r/ n{
9 C& N' z+ B+ s; { char tmp[256],c;; j/ w, ?  D+ K. ]
int i=0;
* \5 t& {# @5 E while(in&gt;&gt;c)
. s# A2 H+ b9 D {/ _! q- g& y1 C; ]( o
  if(c!='*')4 m/ U- K( F* n" m; V. Y# ~( N
  tmp[i++]=c;4 k+ {" X$ W& E+ A! W) y
  else if(c=='*'&amp;&amp;i&gt;0)/ p* Y, U4 R3 f8 l: |. ?
   break;
5 e6 V4 X& o  D6 L! w" `: m3 D }, R& k* |& q3 l6 K  f
if(i&gt;0)( _  p; V7 r. F' c/ {
{8 r8 |  A+ Q: q0 F1 a6 v) N% t0 U
  delete [] str;  j% t5 V  Q# \; C% @; d
  size=i+1;
: H5 s* B# g$ Y+ k2 V  str=new char[size];. @4 ^! G0 M, N: f7 i/ ~! ], v5 q
  if(str==0)% f6 y1 o' c" X" G1 Z, y  M. h' s
   throw "error";; X' h, M7 L/ _* G+ x* e- o# f
  for(i=0;i&lt;size-1;i++)
+ ~6 g2 n4 K0 H      str=tmp;  , N- e1 Q0 ^2 ^9 X4 K7 @, ]
  return size-1;& Q* x( H9 M# w
}6 N; N% @/ E6 t' }' w* t- n
else
. v* W1 M* T% H- w; |  return -1;' m' E* h, w. F) j8 h6 u
}7 \# F7 m* o) O& O: h
void String:refix(), Z' ^/ w+ ?, g- F) d# v" f
{/ Q" W& _% Z0 V/ H, E( |  h
int m=Length();
' o5 v0 Z" L% K5 G# } delete [] pre;9 J+ B% g$ W7 G  Z' t) d- T4 K+ g7 S! x
pre=new int [m+1];& W6 I( R3 ?5 C  {# d! O0 x) |
pre[1]=0;
# U7 x3 K. Z9 a6 j5 x int k=0;
8 K3 }  _. c, n6 s1 P+ H for(int i=2;i&lt;=m;i++)3 D5 ^- n9 E& `% X5 C
{
% H* {0 _% O( k$ ^% D  while((*(str+i-1)!=*(str+k))&amp;&amp;(k&gt;0))0 f) @' S7 l9 [$ b6 c
   k=pre[k];
! C; m6 V4 Q" Z3 f         if(*(str+i-1)==*(str+k))
% P, U0 V- C+ x, p* a    pre=++k;- ]* Q! Z3 U; X( A9 S
   else" r# |; @, q6 Z, _7 q
    pre=0;% B. q7 a9 M7 a2 U' f, q
}
0 ?. Z' k4 Z# l& Y& J  @& a}6 |: I! n# e; K5 \% D; u
void String::ModifiedPrefix()5 M7 o7 b) i7 f+ w- f, f2 e
{
* D# M" a0 a4 j6 { int *f;
. }3 e9 a# o- O; q) t: p int m=Length();# x2 g& Q8 P' d' z7 e) {
f=new int[m+1];$ y! \  ]' t) ~; ^1 P
Prefix();
% M3 [4 n$ s4 T+ A7 }, D. |8 ~ for(int i=1;i&lt;=m;i++)
! T5 x3 h, T- A- ], H$ E {
$ p$ S  y6 B5 S! f/ w* [4 ~    f=pre;
4 a" R5 f" c5 D* H8 ?, Z7 G }
9 y+ S& o! a7 G5 S1 X. R5 K7 O, O for(i=1;i&lt;m;i++). N8 J2 Y) v* U. f' S, u
{0 B' t4 w  e" m6 R$ U0 F
  int k=f;
7 ]! ]! `( a, u5 a2 A2 o  if((k==0)||(*(str+i)!=*(str+k)))% y9 L0 q1 ?. b2 b, u# R: J
   pre=k;
+ g7 C% a* c+ O$ \0 j. H3 x  else 6 w1 C; @0 \. I) B, p
   pre=pre[k];' b7 z. I5 u' l  j
}
" y; \( o$ V0 Z. H$ S! k delete []f;: e! B+ C3 x+ q6 n# ~
}
; `5 }& x& E* y4 P" P& rint String::Match(int i,String&amp; t)6 U  G& D. ?3 q: ^) j
{
6 X; B7 C* @0 f2 ?1 _; E  R int j=0;
8 r+ Y( x2 h9 {1 N! p$ i( f" x int n=Length(),m=t.Length();
. l8 C+ i* q; H* m. {' [! ~ t.ModifiedPrefix();
, ^3 ?6 z) B( K while((i&lt;=n)&amp;&amp;(j&lt;m))" k% x3 r  N) o1 F# K
  if(str[i-1]==t.str[j])
* F) @0 g  C+ n/ _7 Y  {9 X) o# _' b, X) \# Q& q
   i++;
7 S) `) S6 U. w% i  \" X& u2 j' E   j++;
4 n. u% e- s9 N& Y  }
( Y& m6 r5 i9 V$ ?! c( w: L$ M% s& }8 d  else ; K2 G# p0 W8 I
   if(j==0)3 Q" ~+ J9 k# ^0 ^: M+ n2 D- L
        i++;
- i" ^4 j% s( L2 r  ?0 x) O      else 1 K' s" V; D! B* D/ {3 n* [* H
    j=t.pre[j];( `& g' V+ D8 F; j- V/ m, o
  if(j&lt;m)
$ t' X. v$ r1 M   return 0;5 @+ x  v, @! [# b7 a7 z2 c
  else & R! c: `: J) w! x0 a) t% f" g7 t
   return i-1;
( F: M& Q' d: N$ y}: U' [* w3 O6 O# {( e' j
int main()/ F, z# ~* V% s, f2 ^
{
8 g9 O0 A) i! i- h9 {; c# {( W0 B if(in.fail())
4 u$ b; i- ?% w- b {# a' c1 a, L& `& M2 P9 v5 M+ O* K0 A3 f
  cout&lt;&lt;"the input.txt is not exist!";
9 U- n; h" {3 a  exit(1);}8 |) a; e* j  L/ O9 m
int i=1;
& b7 Q5 x8 i( | String s,t;
5 N5 g1 d) M9 R  p6 c s.ReadString();' C, P1 u* u/ o" k4 o
while(t.Rs()+1)9 G% _1 P: _; t# a0 H
{, C, O0 j8 N6 q1 t; q
  i=s.Match(i,t);- A6 s# C9 e8 j. H
  if(!i)
! s2 k$ M3 |% K0 D+ {8 Y" p3 Z! E  {
. T4 ?) E6 z7 j7 b7 L& g5 d      out&lt;&lt;"No"&lt;&lt;endl;
! Q: w+ }2 _! |3 u9 T+ ^   break;
2 O. X5 z% |: ?3 }  }/ x; V$ \. L6 W. C: ^* J8 F
}
9 I1 C; T% f3 C' P if(i)
' b. f! _# J2 r  out&lt;&lt;"Yes"&lt;&lt;endl;* s9 l- B* _+ ]* _. a, @1 S
return 0;- A3 p8 D: P$ @" V5 c1 H
}

间隙字符串匹配问题(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-9-2 23:46 , Processed in 0.433949 second(s), 90 queries .

    回顶部