QQ登录

只需要一步,快速开始

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

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

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

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P>" h8 `; q$ J* q' Z8 D# r
<>[
游客,如果您要查看本帖隐藏内容请回复
[/hide]</P>#include &lt;iostream&gt;! }3 ?7 W# A; u# s
#include &lt;fstream&gt;& z% Z( E3 J1 u7 g5 P8 j# X! x
using namespace std;8 }& M3 T6 U% d9 |' f+ A
ifstream in("input.txt");
" ?  }* Z6 T: ~, Cofstream out("output.txt");
5 Q& n& i# g' m; l; O- Mclass String/ N5 z' M" P  d/ J6 T" S% D8 Y
{4 d  h$ j( ^+ k/ m
  public:1 r  M# u3 Y1 T+ U, U3 U
String(char *s="");
; `3 U8 ]9 i$ k* o  O# S7 ^2 z, I String(const String&amp; s);* `5 d8 \* D+ k; G
~String();. X; Z  w: h6 f8 o
int Length() const;* E1 _6 b  D; ^; a' W% q
int ReadString();6 @# I& @9 M5 e
int Rs();
3 V; ^7 ~: A1 y, o void Prefix();7 r. k" N' E1 x# Y) n
void ModifiedPrefix();
6 }$ W. R% C8 k" K int Match(int i,String&amp; t);
4 v9 ^  @3 |0 z7 G  private:+ ^* w) F! A' J3 |
   char *str;
" v0 S( ^- `7 @7 M0 I0 a   int *pre;- k% Q/ |/ i+ \/ R4 T7 K. |, e
   int size;/ _6 d9 q7 G" B" t
};/ c& {0 W8 f: U) p# S, s% A! h
String::String(char *s)
. a7 Y* V& Y! s: K{
6 N6 d, r0 O! ~: F0 I size=strlen(s)+1;
0 S# c1 e* e8 G% R" o1 l& S- l str=new char[size];
. _' W9 L9 H* z6 b9 g if(str==0)) |+ ]6 f7 T+ d
  throw "error";1 z0 z  W2 z& Q; Z' S
strcpy(str,s);
# P; c+ B. L$ G- C/ ~, T pre=new int[size];: e% c4 U: H% L% K0 {9 L4 `
if(pre==0)( L( x/ k/ R  R5 F
  throw "error";
, {  ^. \/ O& p  M+ B}
! |5 V& E6 E1 y. f- FString::String(const String&amp; s)4 f2 o' H. ?  L9 z4 g- y
{6 W2 M+ h4 b5 d. u6 [
size=s.size;
1 ^8 Q8 P/ I' g" F  u$ N* C str=new char [size];9 l: j& j' [7 V- K
if(str==0)
9 n3 x7 i- P) w  f2 H  throw "error";5 U3 I) y  ~  ~1 b* t4 F
strcpy(str,s.str);! @2 l. @3 R2 n
pre=new int [size];
( B4 l, f( S+ C: @# H if(pre==0)  N4 c1 b  Z! d" C2 _6 x; H2 o
  throw "error";% a  v4 x5 N3 Q  G+ X' [" p
}7 @$ d5 _; W- O" @) z5 d8 g
String::~String()
: P. o4 H5 K  B4 s# C6 ~{+ L* r  {+ {! _
delete [] str;. I7 Q2 \% ~4 Z+ ^  x* ]
delete [] pre;
* z6 p* Z) a; a: E5 r5 J4 T}1 b/ `- L* @  T+ T9 y* Z% D! V
int String:ength() const
$ C$ u0 z% b; p5 p{: `; h7 Y% ~+ ?
return size-1;
! V' r: P& D( `& F  V1 Y}
' g7 E: {9 p5 s9 I- S$ `$ H6 x2 iint String::ReadString()! z2 Y/ y  X5 v+ b! t! f9 d
{; N1 n/ g. [- F, J
char tmp[256];8 |  n( @% I" k1 ?/ w8 U5 g
    if(in&gt;&gt;tmp)
4 Z/ V& N4 ]. j4 l& i {8 k; o4 F, c& Z$ B
  delete [] str;/ v/ n2 b& ]6 B( _
  size=strlen(tmp)+1;4 ^+ w! Q- q* |- Q! r! C
  str=new char [size];! u- p2 C& T0 F3 p7 W
  strcpy(str,tmp);
1 _( z: W0 v+ [- W3 A% x1 `. b  return size-1;
+ {, V, H1 y" ~( y8 L, Z }
3 ?# N* I) F" V, M else6 t7 b, _; Z+ ~& N
  return -1;
  t  l8 Q- \' K  v7 g% c/ D! q}
; H2 c! ?, }5 `" }! Lint String::Rs()
# ~7 K# F' K8 Q! c{- E' V- X: J3 q. U6 v
char tmp[256],c;. Y1 @7 N) v: |7 N
int i=0;
9 x$ r( B# ~4 u# w, m  x4 t/ K while(in&gt;&gt;c)
; e+ _* M; G  [& O3 w {
; |4 D* F: V# {9 _; t  if(c!='*')& c0 _1 `" e3 a" ]1 {6 j* A) l) ]
  tmp[i++]=c;7 K1 g# v+ j$ L' T( j: D1 k
  else if(c=='*'&amp;&amp;i&gt;0)3 G/ f7 y9 F3 @" |9 n0 o$ U
   break;4 d+ v5 A9 N8 F$ G
}
# p4 e- j% w: C2 p9 v if(i&gt;0); e* U+ ?2 p0 O# U  S. ?0 k
{
) @2 f7 K4 `$ u& t% `  delete [] str;0 e% e: N: x4 s  n, m/ }
  size=i+1;* I- K) G  z( \! t
  str=new char[size];5 s8 {# s0 b9 Z7 {( Q- `1 C
  if(str==0)
3 J7 [3 \" ]' Z6 T, @2 h' r# C! ~   throw "error";6 u% x" j' ~; O& ]0 Q: w4 w# Z( ]
  for(i=0;i&lt;size-1;i++)
' |3 Q+ U9 s& f. |* ~# Z' L      str=tmp;  ; P7 C5 I7 K4 V9 l, V7 e
  return size-1;
1 y# d3 I, P7 p8 d$ {* a }: b6 \8 P0 ?/ f
else" _* M" f- B! u, J% H
  return -1;: W0 M# B. A3 L1 Q* P1 I1 |2 e
}
8 H# ~  u: _; L- D/ V6 T" Cvoid String:refix(); ]/ E6 M- I/ P* U1 j
{1 T3 e/ \3 K& b6 t1 ?+ [
int m=Length();
' [$ `, z8 T& h% _ delete [] pre;
( r' ]- {3 h; x8 t& ] pre=new int [m+1];
) m- e+ R" d6 b; @% m$ e, ~9 K pre[1]=0;
; _/ ~. G' b& R8 | int k=0;
& H3 K9 X) V: R: ]: q% U for(int i=2;i&lt;=m;i++)8 D/ y9 E2 q% k7 _7 o0 p$ M* `
{. ~. M7 p3 C2 m4 s# M( N( t% U  {
  while((*(str+i-1)!=*(str+k))&amp;&amp;(k&gt;0))
% s0 h/ P8 V; j6 b  B" P   k=pre[k];8 N! t9 _; L7 f" I( O
         if(*(str+i-1)==*(str+k))
8 E# n* h7 C! P* y) u" J    pre=++k;
+ V8 o1 R0 q' D" U; l3 G1 \1 {% G   else
7 d, `7 D0 z$ t; @    pre=0;5 s  S9 e( p5 }7 ]1 V
}7 L5 e! r6 S0 r% K) E
}
) z) w+ i/ i4 Xvoid String::ModifiedPrefix()
" G, m' D0 g: @% N1 u3 _7 n+ w3 r' I{
% X; _' ?( k6 f' l9 o5 |( p/ f3 A int *f;
; `  J* k( c# e3 W; M% C int m=Length();: w% x; t6 i! g8 \) x5 v- U, o
f=new int[m+1];5 ?1 m% D( v; T+ }9 W
Prefix();
8 j4 @' r8 k# x1 Q* s7 M% f+ @ for(int i=1;i&lt;=m;i++)' S- E1 K* o- i# f8 W
{
. S4 i1 }8 P6 v2 T- r8 k    f=pre;
0 N6 I9 H" ?+ \( f6 p: ?, \ }
4 [1 r/ ^0 F) D2 U for(i=1;i&lt;m;i++)
; M( b: P/ g0 n2 P! c- m& Z {
8 l" \5 {% w; ?/ F0 q  int k=f;
9 o$ W3 J2 W5 v* S; @$ L2 @  if((k==0)||(*(str+i)!=*(str+k)))1 p( ]1 k, D' e8 j( f3 t. n
   pre=k;
+ v9 m8 n( m! I4 x3 b/ j9 T2 A# r  else , X/ \$ k" o9 X8 B
   pre=pre[k];
# `7 `2 }; R6 [' {* q2 T# H }
$ T# ]8 o5 G* A  z2 |* \ delete []f;0 E. `7 j3 _. M: F2 h, ]0 J  e
}. ^" A0 s  Z7 j' \3 L: `
int String::Match(int i,String&amp; t)
0 K' j+ J! i, c! \6 n6 `+ j{
: g, p7 Y$ f# w0 N& F: A int j=0;
4 }1 n) E& a' { int n=Length(),m=t.Length();4 _1 y3 X) A) K/ j9 X: j' e
t.ModifiedPrefix();
( I7 b1 x! a8 c/ u while((i&lt;=n)&amp;&amp;(j&lt;m))
3 L- z. g6 c' O/ ~! A; E- `* O  if(str[i-1]==t.str[j])
' p9 B! s7 p2 p' X0 g. P3 w0 f  w6 B  {
! k+ l+ o6 }  G9 s+ D2 u- Q   i++;& v; t5 d$ m1 ]) r
   j++;
) K# v: y- d9 g% O" S$ C3 _  }! l* h3 D; Z2 y7 |/ o5 Q( @
  else , n% c' z# u+ L8 ]. ~+ b1 N
   if(j==0)* l+ |& v9 s! x; L' A' A9 y( x! c0 r1 x
        i++;6 ?3 q5 q! z" A/ I
      else 8 a+ j6 L  w0 l
    j=t.pre[j];
  t( O! x* c+ o" u! M  if(j&lt;m)/ }$ H# ^/ S( q* s  z* F
   return 0;; t! e1 G2 \/ Y
  else * t; x' T7 R# x: h
   return i-1;: J* O5 [7 B6 k3 F; e! X
}
1 H, |2 f9 u1 w6 c4 ?int main()/ c. G/ h. u# g7 q/ V' m. s
{3 C" u$ M- d; ]  H9 y. C* ?: R
if(in.fail()): o. j5 \  K1 z( d' r, o
{+ c$ [, d. y2 R: A, `
  cout&lt;&lt;"the input.txt is not exist!";  S  H& V  T1 ]3 `2 R) r
  exit(1);}6 Q+ x- d1 h& t
int i=1;; c9 O/ m* N3 d# q
String s,t;
5 V  x  a$ g8 c4 a; V. p, y s.ReadString();
5 F0 p) J7 [+ X0 r6 B! G( p while(t.Rs()+1)8 e) e7 l# T& Q" X  x7 v
{
" A9 ^' s# n# S) f' |% Z  i=s.Match(i,t);6 H9 F( P7 Y6 C+ r# O/ W) K
  if(!i)
  J$ e4 m$ c4 }5 C, h- X& z  {) K- S$ m3 q+ }, x; ^' R
      out&lt;&lt;"No"&lt;&lt;endl;' W6 m; \' G$ ?0 j6 @9 T! M6 _
   break;5 C, j+ |- y2 p6 O/ |  r
  }
) Z, @/ `: x$ F" T9 u. O }
( b" Y  s+ R# ]0 T4 U4 @ if(i)
& R, K3 {5 L7 o1 t+ N6 p0 m% M+ ?  out&lt;&lt;"Yes"&lt;&lt;endl;
$ [% H9 ~. C7 D& i" q- \- j return 0;8 E5 `2 o' v3 E! e
}

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

    回顶部