QQ登录

只需要一步,快速开始

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

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

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

2

主题

2

听众

26

积分

升级  22.11%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-22 01:37 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<>很经典的一道问题,我想大家应该都会,我这次只是想帮助那些还不是很懂得人,还是一样附上解题报告和源代码。觉得好的就顶,主要是用模式串来解决。</P>) \% u) J$ w( T% k" I
<>[
游客,如果您要查看本帖隐藏内容请回复
[/hide]</P>#include &lt;iostream&gt;
6 p  e, s( U( v6 c0 P6 l6 y#include &lt;fstream&gt;, Q6 s, I8 U8 v) O+ m
using namespace std;  ?* l( J. g/ n: k, X) Q3 z
ifstream in("input.txt");
! ^+ g# k# y& k2 y& N" ^$ F& Oofstream out("output.txt");
/ E- p% H- M- x1 i3 |& bclass String/ |( {  V8 \1 e2 j& c
{- a: S! Z" C6 G* P
  public:
. d/ U$ M2 A" U: b. g, v String(char *s="");0 a) l) g7 P, s% j! ?5 ~
String(const String&amp; s);+ \" w8 x) ^4 Z& j  L* x1 Q. `
~String();
2 r4 l7 |/ l" `( b3 h9 F" A int Length() const;: N  C* g: w" V& `7 e# D
int ReadString();8 x) m& t4 m# u" n8 y" ]! U
int Rs();4 e2 b! b, s6 ?( b
void Prefix();4 I4 O6 X( }9 j9 h0 |9 u
void ModifiedPrefix();% \0 L8 l3 \: u3 }$ V3 Y. o& @
int Match(int i,String&amp; t);
# s7 H) `6 Y0 H# v8 F  private:0 ^7 h( T% S* t9 L6 N  m3 W( B
   char *str;
+ \9 t: H: V, V5 }8 t   int *pre;5 S3 R& d6 X( D5 [) v: J- Q
   int size;; E; O. i) ^* K
};# q3 A  ?5 R5 s3 ~
String::String(char *s)1 `( j/ t$ h$ _6 B
{  J7 R/ d( P) S4 ^& e: D6 V
size=strlen(s)+1;
1 @0 M: C% i) o# p2 f$ F- t4 d str=new char[size];0 O' [: |$ g' i3 a- m, ^* F
if(str==0)6 H  p1 j3 `& \/ z' v
  throw "error";
* T! F& m  z7 G strcpy(str,s);+ l9 S/ i/ c: m% D
pre=new int[size];7 h; a' r4 \! ^+ s7 p# _
if(pre==0)( D  r! _; |. l- s4 h# i
  throw "error";8 ~; d3 l$ j( X; H$ ^4 m6 }
}
$ G9 m+ u' f7 |String::String(const String&amp; s)7 l: n8 [- n4 H( H  L! b
{
2 e7 H# Y/ n1 Z; Y size=s.size;
; O4 p  i- ^; T: G) \4 r9 Z5 M) E& s str=new char [size];
3 c  ~3 M' B9 ^6 X  h/ {5 G if(str==0)
5 |! ^7 ?, \4 q0 X! z$ ]4 L8 V  throw "error";& ~/ [& P5 \/ u6 S- a
strcpy(str,s.str);
) D' q5 ^5 W4 [5 }" o pre=new int [size];) v- b, `5 }, a2 J' q4 [( c' m
if(pre==0)
& |5 ^# k' l; R: {! q( Z& b  throw "error";
7 v! A2 f! `* b. ]  k. x9 G! i}5 n1 d) z; e) e1 q* m
String::~String()
" Z5 W" u8 K9 a( Q  _: {{
/ l! X. p1 T8 s delete [] str;' E( p7 m2 i7 G3 Y' A& Q
delete [] pre;
( N7 [) o+ Z* T' r8 j2 J) K- _}
  p/ J( u6 K4 v( @  m7 z' p, w& G9 R( }( bint String:ength() const) o# m8 A9 p' R
{) N8 y9 x/ P! [  x$ Q" W
return size-1;
3 @( R# l4 I$ ?( M2 I+ Z8 _}2 U. {0 t% N/ M9 h) b( B
int String::ReadString()
) B: S) K0 H0 B9 h$ W{
9 R. T4 E/ |2 v- y* a/ J% y1 r char tmp[256];
2 q* K2 f- E) j6 \+ D/ O8 G* N/ o7 z    if(in&gt;&gt;tmp)
4 a: W% B4 f% w  Z7 M" v {4 Z- n% s; n3 w* V* q
  delete [] str;, I, f+ L- I+ r5 C$ O5 e
  size=strlen(tmp)+1;
* @$ F/ D5 @! r. v6 j0 ]: ?( f  str=new char [size];" V. ?" A8 d4 h
  strcpy(str,tmp);/ H( _& i* ^) m* ?1 F) ~
  return size-1;
7 @  k# G7 d8 R, W }3 W& h) i( B, o
else. k3 @  |& i1 R* V% f
  return -1;
0 x% C! _7 f2 i" b5 l2 r5 P}9 X0 y- V4 k/ q& V# u% y
int String::Rs()
) D+ h1 {9 W: n{( j' f* ^6 D; Y+ I5 ]0 Q2 p0 e
char tmp[256],c;
1 s; Y0 z& m# D; M6 N int i=0;
; P$ T, h8 E/ O! P& U5 F- A while(in&gt;&gt;c)& {/ O6 ~+ h$ k2 K
{
5 i7 }& I& j2 n" N' q$ Y6 `4 J  if(c!='*')
8 P7 D* Z8 |( _' C5 N) F  tmp[i++]=c;
# O; @4 c5 i2 h  else if(c=='*'&amp;&amp;i&gt;0)
6 f6 Z5 B% j6 ^" l) r; ^- n2 ]   break;1 \2 L# a, K; F7 k# c4 x0 o4 b. ]8 e
}
! j9 Q/ {4 v4 V if(i&gt;0)
; ?( R! _$ s# k* c {
# p) A5 Y+ B' J/ U& G, Y  delete [] str;
9 Y3 n/ n$ W" @  v7 k- {' A  size=i+1;
5 k) ^. W" d( d# s' N  str=new char[size];
/ g% d$ j) [- x1 k7 T. T  if(str==0)% d1 Z5 b% U: t+ U; N) a
   throw "error";: p" P0 K& v* X' b' q+ H
  for(i=0;i&lt;size-1;i++)1 @  B5 S8 @/ s+ {3 `9 c# x
      str=tmp;  
, p* k/ O/ F& u7 j  return size-1;7 @! d2 n! g/ Z! K$ u; A% S/ o
}
! T- b$ Z1 s  S7 O else' Y$ ^1 m% A/ O: d* x: w
  return -1;0 D8 a4 }9 g% @
}8 C1 J9 T8 E, n4 m3 y9 e
void String:refix()
! [. x# }1 a. f2 a{
( f3 Q( _  @- H9 U* \ int m=Length();
; X' {8 O/ ^' A9 {7 \; L delete [] pre;4 c0 E: x- S; B* ^, s2 k, M* x5 O) ]
pre=new int [m+1];
% u) V; b, x6 e. d# f( ] pre[1]=0;0 D3 q# W( G- F* M
int k=0;" {1 m) ^4 `: j& {- o9 f: U7 b
for(int i=2;i&lt;=m;i++)
1 y1 Q+ }% H& f1 w& e {
; U% q* I! p4 ~% l  while((*(str+i-1)!=*(str+k))&amp;&amp;(k&gt;0)): o& V/ @* s" n' |
   k=pre[k];# h7 e2 T. }4 t
         if(*(str+i-1)==*(str+k))
- ]+ X" P5 T: J. v  y( Y    pre=++k;, \2 P, i# f( p# Y/ I/ x, Z
   else
( b9 i) E- ^2 V; h2 r4 b    pre=0;
1 x$ \$ o$ Z, ^  _. D  p% g. Z }
) O( r+ _# d$ e9 r8 D8 g8 N}
! B: j2 n; L; c6 mvoid String::ModifiedPrefix()1 g) N7 J' }' N2 w/ l
{7 @/ e4 H( L1 o3 S5 ^
int *f;
, M  B' E3 F' h& V3 L int m=Length();: X! S. j( ?8 B& J% g7 N
f=new int[m+1];
5 a/ R1 B2 O! N6 { Prefix();6 P* M$ N1 X' j
for(int i=1;i&lt;=m;i++)0 c* i/ v" U& L0 Q
{: [5 S" j3 \- g+ `( G( ~+ i( ?
    f=pre;
! w3 N- |# I* \; U* ^ }
, E" e; Z; M8 g. e for(i=1;i&lt;m;i++)1 Q9 F- T4 B3 e9 B
{5 X5 t/ d& h& m& F0 D1 ]6 {
  int k=f;
& E1 X( P8 L4 T* ^1 E  if((k==0)||(*(str+i)!=*(str+k)))! w$ ~9 l/ |1 d3 I* N
   pre=k;, h4 @" ^( K2 J: O! H
  else # m" `" V$ ^: g! g/ Q: w+ ?
   pre=pre[k];
. r- D0 e& `2 X3 L, v6 b }
7 r9 u. z9 K. [/ h2 @" f* W( g9 w delete []f;
* Q7 N, q/ m6 V! w: J}4 j, u6 Y4 d- q* K4 V3 g
int String::Match(int i,String&amp; t)
% }: j6 Q. q5 S{
& s8 d' C( P, M2 U int j=0;! I2 B4 E) G" ?4 ]
int n=Length(),m=t.Length();
8 q0 j! r' \0 N0 \4 Y  } t.ModifiedPrefix();, N+ g5 S* t7 f: F+ d- p3 F
while((i&lt;=n)&amp;&amp;(j&lt;m))
: k. W' G* Q' b, X+ g, x  if(str[i-1]==t.str[j])+ I, h  C3 {* `$ V( P
  {4 X8 C& [: J( t9 d  g3 W* Q
   i++;
- G$ T- J$ }. L$ A3 O   j++;
- N3 ^: [7 S2 z) s9 R% K' s5 M  }
0 P5 z$ g( _- W* P% W  else + n/ _# j; y. c+ D" `" O' |
   if(j==0)
) [# j5 F0 ^& Q        i++;- ^1 e4 F+ u  g) I3 q! [$ ], M
      else , m1 S1 o1 c' i1 O) b
    j=t.pre[j];( [8 v7 `( P% [3 N- J$ d
  if(j&lt;m)
1 ?9 G( Z/ ]  G. V% z' a+ J, m: O   return 0;
% [* e7 U! E9 o. ~7 ?  else 5 F. C/ R% Q: S, k0 g
   return i-1;0 {  D- q' s# H& Z3 f! d
}
& V4 u+ Q7 Y3 {7 v) }int main()
- j2 Y$ g( H6 g# ]6 O7 z; _{
& P- h% I$ n& q) ~8 I) e7 C* u; y if(in.fail())1 _7 X5 _8 j* Y  j( N
{6 S7 Q6 S! U% b. _7 P. e* H
  cout&lt;&lt;"the input.txt is not exist!";$ g  c  i: B5 h1 O, [. l" }
  exit(1);}
9 u; d1 @- ?' Z9 a int i=1;/ E0 E& K# [, V/ w8 J/ J
String s,t;, e2 K4 b( i9 }
s.ReadString();
( T1 b. `& R8 |; }: T/ ^1 r5 `5 X while(t.Rs()+1)+ r9 E1 q: |1 {. ]
{
5 U  O5 Y. e% C- H  i=s.Match(i,t);5 n  ]1 S, i' K  g2 X/ j6 [
  if(!i)
" h/ {9 G1 \/ x4 X& `4 X8 g+ R- M& m# B6 x  {% p1 N8 i# K2 P# A0 Z
      out&lt;&lt;"No"&lt;&lt;endl;& h1 N+ `- j6 @" }4 d/ P% {
   break;7 p; F1 S2 r: o) s4 g. _
  }
/ A' c8 [; c. { }
; p* Y& h! S* g+ O if(i)* \% z/ B' k# w# g) @5 ?
  out&lt;&lt;"Yes"&lt;&lt;endl;
' p' I7 Q2 g# @; Z" o$ X! ? return 0;$ V6 v: c+ n& V
}

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

    回顶部