QQ登录

只需要一步,快速开始

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

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

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

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P># t% S; l( `* I
<>[
游客,如果您要查看本帖隐藏内容请回复
[/hide]</P>#include &lt;iostream&gt;/ Q3 ], K2 Y, E) a) I  \
#include &lt;fstream&gt;  r! U8 ?  L+ l+ e4 s
using namespace std;
6 _6 z7 ~$ E; V" O" N* M- u# n7 Bifstream in("input.txt");
' Q0 V- ]( Z; H5 ?& O- Oofstream out("output.txt");
$ D4 i  Y, T! H9 c+ v3 rclass String9 b7 n% k* b+ n6 e$ z
{9 r9 x( q5 m. g/ L. _
  public:
/ D7 O4 B/ g8 Q8 g String(char *s="");
3 d, w& X5 }- N- H! ?( l# v! j String(const String&amp; s);/ v, k  N0 s6 T, f/ j
~String();
% v- d" x" t+ T* ]* y6 D+ U int Length() const;  m1 C+ l" h- x/ |' B
int ReadString();+ j& h( C1 p1 V) q' t' r9 x8 E
int Rs();
! a% W5 f+ N( ~7 d6 M1 }) l( ] void Prefix();
  ~$ c; p$ M+ l! E" L void ModifiedPrefix();+ `% l% l! k+ Q) Z
int Match(int i,String&amp; t);
. K$ c& Y5 I. o( j  private:; T$ j( z% m; j& e; v) H
   char *str;
0 O$ r9 V+ L7 O6 u. Q   int *pre;; y+ i! p. T% h' s, {5 |
   int size;
6 Z: I5 q8 _# _5 f};
5 e/ I/ C& P: [" V2 q" jString::String(char *s)
2 B: ?& V9 `, n* D& U6 j- F6 d{
# |, Z7 l+ Q. C) w+ X+ \8 `2 ` size=strlen(s)+1;
( S* T7 ^3 L* o0 ^2 s; X/ e str=new char[size];
3 y/ [9 V) S6 b  e9 v2 _8 e( ] if(str==0)
& o: N- O/ u  A7 w; u% |! x# O9 @) s  throw "error";
) z; L) D' P, U$ q% d strcpy(str,s);
7 U" r- e) F4 d pre=new int[size];/ [# U% ]( {+ V" t. C9 h* A+ a
if(pre==0)8 I# Y2 n; p6 b% t$ _) p
  throw "error";6 m% B  F0 A$ i8 ~; ^0 e
}: ^4 x' o1 J7 Y/ O8 r' P* Q
String::String(const String&amp; s)8 X/ @; q# i8 l) y# x  }1 {( B
{
/ U  r  ]& J% N8 \: d size=s.size;! Y! M+ v4 ~  \9 q6 K+ }# P0 X
str=new char [size];' X; d2 ]" t% j! d& n
if(str==0)' U# r. u2 k5 K4 ~4 N
  throw "error";- ^- ~) |8 x5 L, M" I) g8 A
strcpy(str,s.str);
( b+ |1 k4 `5 k+ D; a pre=new int [size];
7 o/ Q9 K( A9 G if(pre==0)' N4 l# }7 J' H! C; a, P
  throw "error";; @5 l' n) o! A% x! g+ X
}
) K0 T% B1 o- C! o; a& ^, C: I" A, ~String::~String()
( N: c4 B& r; _% Z9 g1 @{! I/ F- e: q; D" k% O
delete [] str;6 G8 d) S. D" a9 D
delete [] pre;# x: z6 A8 ~# v1 h( g: u. j
}0 Y2 M/ @- f1 \1 G
int String:ength() const
" D0 o( c  H3 U{$ s$ X4 t4 V( @$ [$ F( q/ F
return size-1;
# B4 o& T" g' o* }}7 n+ \: V% Y" ?2 ]$ W+ w
int String::ReadString()3 z' X: K0 ^( o% s
{' U. Z3 K- S4 V$ G7 c% i& d
char tmp[256];
( S* F  j+ ?, r' z* e8 l$ {* |* u    if(in&gt;&gt;tmp)# o+ \) i( w8 Z  S6 j+ u6 O
{& L, u  W8 G/ h, M
  delete [] str;
# @, ^( X1 O, t9 l5 o  size=strlen(tmp)+1;
0 A! `3 l  w/ p. _6 l  str=new char [size];' g5 Q/ N1 \) m' B
  strcpy(str,tmp);
* T" y6 e, |& G7 v+ w: s  return size-1;
* Y: V6 _- s/ b; O" | }
) X: V9 m, s8 f, I5 ]$ q, s" ^ else
6 G! u4 i3 k- X9 L- Z% ~  return -1;) V7 j& u! k9 V0 y" w
}% Q  @; Q3 t: k
int String::Rs()
- m8 Z( V$ _3 k& m( U{8 x2 d: v) X% m& |0 o. q
char tmp[256],c;
% g  d+ E; y6 b  u) `: g6 |2 F  p int i=0;5 [: d9 Q$ n( j
while(in&gt;&gt;c)# B& _, q3 o/ p$ m
{0 g6 G) r2 D, H$ r# [& N# Q
  if(c!='*')
+ s; [' Z6 w: j  tmp[i++]=c;
% d$ r' h1 x2 }: m  o  else if(c=='*'&amp;&amp;i&gt;0)
4 B: k  Z% ~# s0 K6 J# P   break;
5 \4 u5 A: B! G7 r3 a9 M }
# \0 N1 h7 e+ E- R. t0 _ if(i&gt;0)& u, u, V% U, m6 ~" ^* T2 n
{
  o9 j" P* |# n1 z- H% g* ~! r  delete [] str;
$ x, L. R2 V' E) L' B2 J  size=i+1;
: ^2 ?5 S: s7 [8 N* n4 I% i) _0 ?1 o  str=new char[size];' ^8 v+ U+ U. {; a
  if(str==0)* g8 @$ l& J! V$ e, E
   throw "error";
1 W( ~7 U5 ^9 d2 |4 g  for(i=0;i&lt;size-1;i++)) O4 u9 q1 K- D. c% M( g2 |
      str=tmp;  , |, M0 o' S* r) ^! G
  return size-1;
7 n4 q# V, w4 x$ ?8 w3 K. f }! D! s/ b+ g9 E9 {; T: }: o
else
1 O2 d% T+ V9 |  return -1;
/ S% l% G) `. l; h/ N: h& m+ c}" X: y1 r$ A; E( M( W4 M) x5 ?
void String:refix()5 e# p3 R& |: B5 b6 a: Q
{
7 r! n* x2 I4 ~ int m=Length();: W3 I; B4 k5 @5 r
delete [] pre;
, K; f1 Z) A( e& p# V5 }% o# ^ pre=new int [m+1];, u7 o* d* y5 E' {; Z4 [4 y# K2 c5 O
pre[1]=0;9 u# P  ^/ {: ], n# r
int k=0;
( z+ ]1 o" m2 s8 U5 k$ b for(int i=2;i&lt;=m;i++)
3 Q+ J4 `* _/ ^( } {. G4 B5 ^; Y3 t% ~$ [
  while((*(str+i-1)!=*(str+k))&amp;&amp;(k&gt;0))5 _& y" H3 d+ S+ T$ M* k! c8 R
   k=pre[k];
0 c" y/ C0 M% a- Z) J# `         if(*(str+i-1)==*(str+k))/ B( E9 M7 {. a6 E
    pre=++k;
7 L% k8 S& V. ^+ \7 ?, g   else
, T8 J2 B3 S" j1 v5 }    pre=0;
4 ~6 i+ u/ J8 R }, W; S4 q, ]! Y2 \# \
}0 l9 |! [0 q! Q4 l
void String::ModifiedPrefix()
) ~% N$ v, m. D. C5 R{# N/ k4 @, G7 u2 M* j: V
int *f;
' ^. O+ l/ |# P int m=Length();4 L. K3 A0 {8 z1 R
f=new int[m+1];
1 N1 G# Z4 z9 G- Y& ^( E% p Prefix();
# v- C4 c+ W' c: ^8 Z4 f for(int i=1;i&lt;=m;i++)* a% C& B0 Y1 d9 J# u5 \: ]9 f2 _
{( ?2 T8 g' t( I. [
    f=pre;
! u6 ?) \; v1 P5 w9 y1 ]* [ }  {* e, h; `; F8 O& |3 c
for(i=1;i&lt;m;i++)
* N* A3 o8 M0 g) R1 y( N. U {4 I) v+ J4 y# i  n% d2 Q
  int k=f;
$ y2 P; y3 w# {& k/ O5 T  if((k==0)||(*(str+i)!=*(str+k)))
6 }5 ^( @0 G* n& b# X4 P# I1 Y   pre=k;0 A7 ^. q# `" f- v4 V
  else ( ]" f' ]0 w6 ~% P9 X
   pre=pre[k];
) s6 z' F9 e+ @4 y }
$ ]. w5 Q, z6 @+ Q" [ delete []f;
) l# z# V$ _, _" \: Y" d}
  Y- ]0 J7 z* D. N( sint String::Match(int i,String&amp; t)& z* F2 X* `: J
{
5 f5 q$ b& Z- p6 Y) U int j=0;8 s  Q  v6 s- F. U3 c
int n=Length(),m=t.Length();/ J1 p* d5 |0 A' L" H% P6 r6 L. c
t.ModifiedPrefix();) e' K) T% r' L4 I
while((i&lt;=n)&amp;&amp;(j&lt;m))2 j+ M1 c" M( n/ H6 c
  if(str[i-1]==t.str[j])
. m; f6 ~/ M+ {* a  {# Z5 c5 a9 g$ z% |3 T% D9 m
   i++;$ A* `  B( E2 A
   j++;
; q7 ?3 H# z6 {% k+ ]% H  }7 ]: T9 B* H- H% j; A' E2 Q
  else 8 C1 z+ O7 H! x8 Y1 W
   if(j==0)
# o4 v% S4 y% ~( r  p7 U0 V        i++;
# K9 Z: F& T& }& _      else
, {  g) @) X" S6 _9 Q1 ^& F+ W$ a    j=t.pre[j];5 s# T' k' ]6 F7 h" [
  if(j&lt;m), V% D; y4 N6 I" W! H1 e+ y
   return 0;
* p* `% U7 E: a) q* c: h4 ~& I& e  else
% h, e/ [, A+ z' P   return i-1;- s% `9 U8 v0 S6 b1 n2 y
}+ o. ]" l1 Z! J+ F/ E
int main()0 d) _+ m& e8 Q8 `2 `0 }
{
7 m; I. U/ L+ K0 p# d+ A+ |2 @ if(in.fail())
0 O! [. ?: U$ K3 @# l {
2 T' ~/ x9 k; _9 E) l" d  cout&lt;&lt;"the input.txt is not exist!";0 h4 C" v1 p& M. J
  exit(1);}! C# v5 r0 ?; l
int i=1;
4 U, Y/ Q( P. Z String s,t;
7 T6 i# T; i# j" L s.ReadString();6 H: `6 W  {4 A8 m9 u4 a/ g) S
while(t.Rs()+1)
1 j6 r0 S4 u) x {( `+ q$ ]. @. o1 N* P* r3 t
  i=s.Match(i,t);
5 M7 b$ ]$ c$ G& p6 c5 B' e  if(!i)5 y0 M) s4 U8 M# Z$ ^; Z
  {
4 `- k) c9 v# p      out&lt;&lt;"No"&lt;&lt;endl;
0 j  A" i! h1 \  f1 R  Y- S9 n   break;/ ?( i3 O6 h1 c( e" R
  }2 y; l: L/ T3 x' e! U
}+ O  r1 X) b# A: L0 e" F5 @
if(i)5 j9 @" W9 i6 x9 H$ i
  out&lt;&lt;"Yes"&lt;&lt;endl;
8 d0 e1 S( s  ^2 g& Z9 D, X; G return 0;$ R; S" L( r' |. b. f1 ?4 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-6-3 11:25 , Processed in 0.396065 second(s), 90 queries .

    回顶部