【字符串处理算法】删除特定的字符的算法设计及C代码实现

一、需求描述

输入一个长字符串和一个短字符串,编写程序从长字符串中将在短字符串出现过的字符删除掉。

例如,长字符串为“1234abcd”,短字符串为“3a”,那么经程序处理之后的字符串为“124bcd”;又如,长字符串为“good bye”,短字符串为“obh”,那么经程序处理之后的字符串为“gd ye”。

二、算法设计

我们可以通过将长字符串中的字符逐个与短字符串中的字符相比较来判断是否应该将某个字符从长字符串中删除掉。

即如果长字符串为“1234abcd”,短字符串为“2a”,那么先将长字符串中的第一个字符“1”分别与短字符串中的“2”和“a”相比较,发现都不相等,于是将字符“1”加入到新的字符串中;接着将长字符串中的第二个字符“2”分别与短字符串中的“2”和“a”相比较,发现有相等的,于是不将字符“2”加入到新的字符串中;如此循环执行,直到长字符串中的所有字符都比较完成。

三、特殊流程考虑

在编写程序的过程中,我们要对输入的字符串的长度及格式多做考虑,如:

1.如果输入的两个字符串之一含有中文字符,那么程序直接返回而不执行后续流程。

2.如果输入的短字符串的长度大于了长字符串的长度,那么程序直接返回而不执行后续流程。

四、程序代码

五、程序测试

我们将编写好的程序“RemoveChars.c”上传到Linux机器,并使用“gcc -g -o RemoveCharsRemoveChars.c”命令对该程序进行编译,生成“RemoveChars”文件。下面对程序进行详细的测试。

1.输入长字符串为“1234abcd”,短字符串为“2a”时,程序运行情况如下:

Please input the long string:

1234abcd

InputLongStr=1234abcd

Please input the short string:

2a

InputShortStr=2a

Remove chars of 2a from 1234abcd, the new str is: 134bcd

2.输入长字符串为“Happy dog!”,短字符串为“ao”时,程序运行情况如下:

Please input the long string:

Happy dog!

InputLongStr=Happy dog!

Please input the short string:

ao

InputShortStr=ao

Remove chars of ao from Happy dog!, the new str is: Hppy dg!

3.输入长字符串为“我们123”,短字符串为“345”时,程序运行情况如下:

Please input the long string:

我们123

InputLongStr=我们123

Please input the short string:

345

InputShortStr=345

我们123 has Chinese character, please check!

4.输入长字符串为“12345”,短字符串为“234567”时,程序运行情况如下:

Please input the long string:

12345

InputLongStr=12345

Please input the short string:

234567

InputShortStr=234567

234567 is longer than 12345, please check!

5.输入长字符串为“abcdsf”,短字符串为“af2”时,程序运行情况如下:

Please input the long string:

abcdsf

InputLongStr=abcdsf

Please input the short string:

af2

InputShortStr=af2

Remove chars of af2 from abcdsf, the new str is: bcds

六、需求扩展

基于本文中的需求和程序,我们可考虑对需求进行以下扩展:

1.如果短字符串中的某个字符在长字符串中存在,那么在长字符串的对应位置用空格占位,而不是直接将该字符从长字符串中删除。

2.不限制输入字符串中不能出现中文字符,即如果长字符串为“我们123”,短字符串为“我1”,那么经程序处理之后的字符串为“们23”。

时间: 2024-10-20 13:25:34

【字符串处理算法】删除特定的字符的算法设计及C代码实现的相关文章

36.在字符串中删除特定的字符

http://zhedahht.blog.163.com/blog/static/25411174200801931426484/ 题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符.例如,输入"They are students."和"aeiou",则删除之后的第一个字符串变成"Thy r stdnts.". 分析:这是一道微软面试题.在微软的常见面试题中,与字符串相关的题目占了很大的一部分,因为写程序操作字符串能很好的反映我们的

【编程题目】在字符串中删除特定的字符

63.在字符串中删除特定的字符(字符串).题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符.例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”. 我的思路:先扫描第一个字符串,判断是否是第二的字符串的字符,是则跳过,记录跳过多少个,后面的不被删除的就前移. /* 63.在字符串中删除特定的字符(字符串). 题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符. 例如,输入”They are s

C# 操作字符串,在某些特定的字符后面或前面添加其它字符

C# 操作字符串,在某些特定的字符后面或前面添加其它字符,解决方法: 字符串替换或正则表达式替换即可. 示例:string s = @"第1种方案(约6站)在 泉城广场 坐 14路 到 按察司街北口/市立一院 换乘 11路/K109路 到 老东门第2种方案(约7站)在 泉城广场 坐 128路 到 朝山街北口/朝山街南口 换乘 36路 到 老东门第3种方案(约7站)在 泉城广场 坐 14路 到 大明湖东门 换乘 14路/30路/31路/36路/46路/83路/K98路 到 老东门第4种方案(约7站

在字符串中删除特定的字符

题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符.例如,输入"I am lavor_zl."和"I love you.",则删除之后的第一个字符串变成"amar_z".要求相对于第一个字符串的长度n时间复杂度为O(n). 解题思路:用一个bool数组保存是否在第二个字符串中出现的所有字符,数组下标表示字符,这个数组的长度为256,因为C/C++中字符总共有256个.遍历第一个字符串,用一个指针或数组下标access来表示当前访问第

在字符串中删除特定字符

63.在字符串中删除特定的字符.题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符.例如,输入”They are students.”和”aeiou”, 则删除之后的第一个字符串变成”Thy r stdnts.”. 思路: 1. 位图法 将两个字符串分别转换成bitmap 然后对他们做异或xor运算,得到的结果即为排除了第二个字符串的所有字符, 然后对该结果依次与原字符串的所有字符进行与运算,结果不为零的即为所得    恩 位图真是个好东西啊...时间复杂度o(n+m) 花在了遍历

算法基础:删除字符串中出现次数最少的字符(Golang实现)

描述: 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串, 字符串中其它字符保持原来的顺序. 输入: 字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节. 输出: 删除字符串中出现次数最少的字符后的字符串. 样例输入: abcdd 样例输出: dd 代码实现 package huawei import ( "fmt" ) func Test4Base() { s := "abcfbcca"

算法分析---删除字符串中出现次数最少的字符

编写一个函数,删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串.字符串中其他字符保持原来的顺序. 格式说明: 字符串仅仅包括字母.不可能为空串,不包括空格,单词仅仅由小写英文字母组成.输入的字符串长度不会超过20个char . 算法思路: (1)定义一个长度为26的整型数组 下标从0-25分别表示a-z这26个小写字母,用来保存字符串中各个字符出现的次数 (由于'a'-'a'=0,'z'-'a'=25刚好与数组的下标相应) "abcdddeeffffx

删除给定字符的算法

面试中,面试官问我现场写的一个算法题目:给定一个字符串和一个字符,删除字符串中包含和此字符相同的字符. 算法1: 1 #include<stdio.h> 2 3 void delChar(char * str, char p){ 4 int i = 0; 5 int j = 0; 6 while(str[j] != NULL){ 7 if(str[j] == p) 8 j++; 9 else{ 10 str[i] = str[j]; 11 i++; 12 j++; 13 } 14 } 15 s

[算法]将字符串中的*前置,非*字符相对位置不变

如ab**cd*e12变成 ****abcde12 char* foo(char* str, int length){ int i = length-1,j = length-1; while(i >= 0 && j >= 0){ while(i >= 0 && '*' != str[i]){ --i; } j = i - 1; while(j >= 0 && '*' == str[j]){ --j; } if(j >= 0){