字符串编程,将字符串S中出现的子串T1用字符串T2替代。

原创 2004年10月21日 19:19:00

/*字符串编程,将字符串S中出现的子串T1用字符串T2替代

ahebhechedhe

he

hello!

ahello!bhello!chello!dhello!

*/

/*静态数组实现*/
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>

#define MAXSTRLEN 255

typedef unsigned char SString[MAXSTRLEN + 1];
typedef int Status;

void StrAssign(SString &S,char *chars)
{//串赋值
 int length = 0;
 unsigned char * Sclient = S + 1;

 while(*(chars))
 {
  *Sclient = *chars;
  chars++;
  Sclient++;
  length++;
 }
 *Sclient  = '/0';
    S[0] = length;
}

void Display_String(SString S)
{//串显示
 cout<<S + 1<<endl; 
}

int Index(SString S, SString T, int Pos)
{//在串S中扫描子串T的位置值,如不存在子串T返回0
 unsigned char *Sclient = S + 1;
 int clientLen = 0;

 if (Pos > S[0])
  return -1;
 T++;
 while (*(Sclient))
 {
  while(*(T) == *(Sclient + Pos))
  {
   T++;
   if (!*T)
    return Pos;
   clientLen++;
   Sclient++;
   
  }
  
  Sclient = Sclient - clientLen;
  Pos++;
 }
 return -1;
}
void Delete(SString &S, int pos, int len)
{//在串S中删去从pos位置开始的len个字符
 S[0] -= len;
 unsigned char * Sclient = S + 1;

 while (*(Sclient + len + pos))
 {
  *(Sclient + pos) = *(Sclient + pos +len);
  Sclient++;
 }
 *(Sclient + pos) = '/0';
 
}


void Insert(SString &S,int &pos,SString T)
{//在串S的pos位置插入子串T
 int i;

 if(pos  != S[0])
 {
  for (i = 0; i < S[0] - pos; i++)
  {
   *(S + S[0] + T[0] - i) = *(S + S[0] - i);
  }  
 }
  
 for(i = 0; i < T[0]; i++)
 {
  S[pos + i + 1] = T[i + 1];
 }
 S[0] += T[0];
 *(S + S[0] + 1) = '/0';
 pos += T[0];
}

void Replace_SubString(SString &S, SString T1, SString T2)
{//通过对Index、Delete和Insert函数的调用,完成将串S中出现的子串T1用串T2替代
 int pos = 0;
 int posFlag = -1;
 
 while (1)
 {
  pos = Index(S, T1, pos);
  
  if (pos < posFlag)
   break;
  posFlag = pos;
  
  Delete(S, pos, T1[0]);
  Insert(S, pos, T2);
 }
}


void main( void )
{
 SString S, T1,T2;

 StrAssign(S, "ahebhechedhe");
 
 Display_String(S);
 
 StrAssign(T1,"he");
 
 Display_String(T1);
 
 StrAssign(T2,"HELLO!");
 
 Display_String(T2);

 Replace_SubString(S,T1,T2);
 
 Display_String(S);
}


/*用动态链表实现:*/
#include <stdio.h>
#include <stdlib.h>

#define MAXSTRLEN 255

typedef struct
{
 char *ch;
 int length;
} HString;

void StrAssign(HString &S, char *chars)
{
 //串赋值
 char*  c;
 int    i, j;

 if (!S.ch)
  free(S.ch);

 for (i = 0, c = chars; *c; c++, i++ );

 if (!i)
 {
  S.ch = NULL;
  S.length = 0;
 }
 else
 {
  if (!(S.ch = (char*)(malloc(sizeof(char) * i))))
   return;
  
  for (j = 0; j < i; j++)
   S.ch[j] = chars[j];
 }
 S.length = i;
 
}

void Display_String(HString S)
{//串显示
 if (S.ch == NULL)
  return;
 int i;
 for(i = 0; i < S.length; i++)
  printf("%c", S.ch[i]);
 printf("/n");
}

int Index(HString S, HString T,int Pos)
{//在串S中扫描子串T的位置值,如不存在子串T返回0
 int clientLen = 0;
 char * Tclient = T.ch;
 
 if (Pos >= S.length)
  return -1;
 char * Sclient = S.ch;
 while ((Sclient - S.ch) <= S.length)
 {
  while(*(Tclient) == *(Sclient + Pos))
  {
   if ((Tclient - T.ch) < S.length)
    return Pos;
   Tclient++;
   clientLen++;
   Sclient++; 
  }
  Sclient = Sclient - clientLen;
  Pos++;
 }
 
 return -1;
}
void Delete(HString &S,int pos,int len)
{//在串S中删去从pos位置开始的len个字符
 int i;

 for (i = 0; i < (S.length - pos); i++)
  S.ch[pos + i] = S.ch[pos + i + len];
 S.length -= len;
}

void Insert(HString &S,int &pos,HString T)
{//在串S的pos位置插入子串T
 S.ch = (char *)realloc(S.ch, T.length + S.length);
 S.length += T.length;
 int i;
 
 if(pos  != S.length)
 {
  
  for (i = 0; i < S.length - pos; i++)
  {
   *(S.ch + S.length + T.length-1 - i) = *(S.ch + S.length -1- i);
  }  
 }
 
 for(i = 0; i < T.length; i++)
 {
  S.ch[pos + i] = T.ch[i];
 }
 pos += T.length;
 
}

void Replace_SubString(HString &S, HString T1,HString T2)
{// 通过对Index、Delete和Insert函数的调用,完成将串S中出现的子串T1用串T2替代
 int pos = 0;
 int posFlag = -1;
 
 while (1)
 {
  pos = Index(S, T1, pos);
  
  if (pos < posFlag)
   break;
  posFlag = pos;
  
  Delete(S, pos, T1.length);
  Insert(S, pos, T2);
 }
 
}


void main()
{
 HString S, T1, T2;

 StrAssign(S, "ahebhechedhe");
 
 Display_String(S);
 
 StrAssign(T1, "he");
 
 Display_String(T1);
 
 StrAssign(T2, "hello!");
 
 Display_String(T2);
       
 Replace_SubString(S,T1,T2);
 
 Display_String(S);
}

C++ string 使用的注意:memcpy

//---------------------------------------------------- //AUTHOR: lanyang123456 //DATE: 2014-10-28 ...
  • lanyang123456
  • lanyang123456
  • 2014年10月30日 22:13
  • 4705

将s所指字符串中最后一次出现的与t1所指字符串相同的子串替换为t2所指字符串

题目 将s所指字符串中最后一次出现的与t1所指字符串相同的子串替换为t2所指字符串。分析: 1.s是源字符串 2.t1为指定字符串,需要在s中找一致的字符串,要找到最后一次完全匹配的字符串 3...
  • XiaoCaiDaYong
  • XiaoCaiDaYong
  • 2017年04月20日 19:26
  • 1026

hdu 6194 恰好出现k次的子串

传送门 题意:给你一个字符串,和一个k,问你字符串中恰好出现k次的子串有多少种。 思路:HDU4641的简化版,HDU4641求的是>=k次的子串个数,所以现在我们只需跑两次计算出>=k...
  • qq_36553623
  • qq_36553623
  • 2017年09月12日 00:01
  • 291

五十道编程小题目 --- 49 计算字符串中子串出现的次数 java

【程序49】  题目:计算字符串中子串出现的次数  public class Test49 { public static void main(String[] args) {...
  • wangnanwlw
  • wangnanwlw
  • 2016年09月12日 17:01
  • 2433

java 计算字符串中子串出现的次数

import java.util.*; public class SubStr { public static void main(String[] args) { Scanner ...
  • u012512155
  • u012512155
  • 2014年04月18日 14:25
  • 2391

寻找字符串A中完全包含字符串B的最短子字符串

已知两个字符串a和b。寻找字符串a
  • linshengchao123
  • linshengchao123
  • 2014年10月31日 20:07
  • 1548

第十五周 OJ总结<13>--字符串比较

 Copyright (c) 2016, 烟台大学计算机与控制学院 All ringts reserved. 文件名称:OJ总结--包含B的字符串 作 者:王兴振 完成日期:2016年1...
  • wxz1814
  • wxz1814
  • 2016年12月13日 17:08
  • 486

编程. 已知字符串:"this is a test of java". 按要求执行以下操作: (1) 统计该字符串中字母s出现的次数 (2) 取出子字符串"test" (3) 用多种方式将本字

编程. 已知字符串:"this is a test of java". 按要求执行以下操作: (1) 统计该字符串中字母s出现的次数 (2) 取出子字符串"test" (3) 用多种方式将本字...
  • Fredrik
  • Fredrik
  • 2017年05月18日 15:35
  • 1140

Java 中计算字符串中子串出现的次数

统计一个字符串中子串出现的次数,
  • l2tp1012
  • l2tp1012
  • 2014年06月09日 22:14
  • 11716

给定一个字符串,找到包含该字符串所有字符的最短子串

这题是豌豆荚二面的一个算法题,和leetcode的某些题目类似。其思路是这样的 首先遍历一次字符串,求出字符串不同字符的数目 为每一个字符保存一个列表,记录该字符在字符串中出现的索引 记录待求字符串的...
  • WuyouJie2008
  • WuyouJie2008
  • 2015年04月15日 17:06
  • 2493
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符串编程,将字符串S中出现的子串T1用字符串T2替代。
举报原因:
原因补充:

(最多只允许输入30个字)