【转】http://zhedahht.blog.163.com/blog/static/25411174200801931426484/
题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。
分析:这是一道微软面试题。在微软的常见面试题中,与字符串相关的题目占了很大的一部分,因为写程序操作字符串能很好的反映我们的编程基本功。
要编程完成这道题要求的功能可能并不难。毕竟,这道题的基本思路就是在第一个字符串中拿到一个字符,在第二个字符串中查找一下,看它是不是在第二个字符串中。如果在的话,就从第一个字符串中删除。但如何能够把效率优化到让人满意的程度,却也不是一件容易的事情。也就是说,如何在第一个字符串中删除一个字符,以及如何在第二字符串中查找一个字符,都是需要一些小技巧的。
首先我们考虑如何在字符串中删除一个字符。由于字符串的内存分配方式是连续分配的。我们从字符串当中删除一个字符,需要把后面所有的字符往前移动一个字节的位置。但如果每次删除都需要移动字符串后面的字符的话,对于一个长度为n的字符串而言,删除一个字符的时间复杂度为O(n)。而对于本题而言,有可能要删除的字符的个数是n,因此该方法就删除而言的时间复杂度为O(n2)。
事实上,我们并不需要在每次删除一个字符的时候都去移动后面所有的字符。我们可以设想,当一个字符需要被删除的时候,我们把它所占的位置让它后面的字符来填补,也就相当于这个字符被删除了。在具体实现中,我们可以定义两个指针(pFast和pSlow),初始的时候都指向第一字符的起始位置。当pFast指向的字符是需要删除的字符,则pFast直接跳过,指向下一个字符。如果pFast指向的字符是不需要删除的字符,那么把pFast指向的字符赋值给pSlow指向的字符,并且pFast和pStart同时向后移动指向下一个字符。这样,前面被pFast跳过的字符相当于被删除了。用这种方法,整个删除在O(n)时间内就可以完成。
接下来我们考虑如何在一个字符串中查找一个字符。当然,最简单的办法就是从头到尾扫描整个字符串。显然,这种方法需要一个循环,对于一个长度为n的字符串,时间复杂度是O(n)。
由于字符的总数是有限的。对于八位的char型字符而言,总共只有28=256个字符。我们可以新建一个大小为256的数组,把所有元素都初始化为0。然后对于字符串中每一个字符,把它的ASCII码映射成索引,把数组中该索引对应的元素设为1。这个时候,要查找一个字符就变得很快了:根据这个字符的ASCII码,在数组中对应的下标找到该元素,如果为0,表示字符串中没有该字符,否则字符串中包含该字符。此时,查找一个字符的时间复杂度是O(1)。其实,这个数组就是一个hash表。这种思路的详细说明,详见本面试题系列的第13题。
基于上述分析,我们可以写出如下代码:
///////////////////////////////////////////////////////////////////////
// Delete all characters in pStrDelete from pStrSource
///////////////////////////////////////////////////////////////////////
void DeleteChars(char* pStrSource, const char* pStrDelete)
{
if(NULL == pStrSource || NULL == pStrDelete)
return;
// Initialize an array, the index in this array is ASCII value.
// All entries in the array, whose index is ASCII value of a
// character in the pStrDelete, will be set as 1.
// Otherwise, they will be set as 0.
const unsigned int nTableSize = 256;
int hashTable[nTableSize];
memset(hashTable, 0, sizeof(hashTable));
const char* pTemp = pStrDelete;
while ('\0' != *pTemp)
{
hashTable[*pTemp] = 1;
++ pTemp;
}
char* pSlow = pStrSource;
char* pFast = pStrSource;
while ('\0' != *pFast)
{
// if the character is in pStrDelete, move both pStart and
// pEnd forward, and copy pEnd to pStart.
// Otherwise, move only pEnd forward, and the character
// pointed by pEnd is deleted
if(1 != hashTable[*pFast])
{
*pSlow = *pFast;
++ pSlow;
}
++pFast;
}
*pSlow = '\0';
}
分享到:
相关推荐
对于更复杂的字符串操作,如删除特定类型的空白字符(如制表符、换行符),可能需要使用“替换字符串”函数。此外,如果需要处理多个字符串,可以考虑使用数组操作或循环结构。 总之,LabVIEW提供了一系列强大的...
在C#编程语言中,处理字符串是常见的任务之一,其中包括删除字符串中的特定部分或子字符串。本篇文章将详细探讨如何在C#中实现这一功能,包括多种方法和实用技巧。 首先,C#提供了多种内置方法来操作字符串,比如`...
2. **子字符串删除**:对于删除特定子串,`Replace()`方法同样适用。假设我们想删除包含"World"的部分: ```csharp s = s.Replace("World", ""); ``` 现在`s`变成了"Hello, !"。 3. **字符数组与遍历**:若需更复杂...
在Java编程语言中,字符串处理是一项基础且重要的任务。在这个特定的场景中,我们需要创建一个Applet程序,它能够接收用户输入的字符串和一个字符,...但上述代码仍然展示了如何在Applet环境中处理字符串删除的操作。
例如,`字符串替换`函数可以用来查找并替换掉指定的字符或字符串,`字符串删除`函数则能帮助我们移除字符串中的某个部分。 源码可能包含了以下关键步骤: 1. 定义字符串变量:首先,你需要创建一个变量来存储待...
此代码示例提供了一种高效的方法来移除字符串中的特定字符,并且已经在Windows和Linux环境下进行了测试验证。 ### 一、理解需求 首先,我们要明确本程序的功能:删除一个字符串中所有出现的指定字符。例如,给定...
在易语言中,可以编写特定的程序来遍历和分析代码,找出那些不再被引用的字符串,然后将它们从程序资源中删除。这个过程通常需要对程序的结构有深入理解,以便正确识别哪些字符串可以安全地删除,而不会影响程序的...
初学者常常会遇到如何在特定位置删除字符串中的某个部分。在Delphi7中,这可以通过多种方法实现,包括使用内置的字符串函数、正则表达式或者自定义的逻辑。本文将详细讲解如何在指定位置删除一个字符串。 首先,...
在这种情况下,你可能需要在转换过程中加入额外的处理步骤,比如添加或删除特定的字符、去除空白等。 对于初学者来说,理解LabVIEW的这种数据处理方式可能会有些困难,但通过实践和查阅文档,可以很快掌握。在进行...
因此,当我们需要删除字符串中的特定字符时,通常需要创建一个新的字符串来存储结果。下面我们将介绍两种主要的方法来完成这个任务: 1. 使用`StringBuilder`或`StringBuffer`类: `StringBuilder`和`StringBuffer...
在这个例子中,我们关注的是如何从一个存储在单链表中的字符串中删除从特定位置开始的若干个字符。 #### 三、关键函数解析 ##### 3.1 `LinkList* set()` —— 初始化链表 该函数用于初始化链表,即创建一个空的...
在 MATLAB 中处理文本数据时,经常需要执行一些基本操作,如删除特定字符或比较不同的字符数组和字符串。本文档将详细介绍如何使用 `strrep` 函数删除字符以及如何利用 `isequal` 函数比较字符数组和字符串。 #### ...
Delete:字符串删除 `Delete` 函数允许从字符串中删除指定位置的字符或子串。例如,`Delete('ILikeReadingCPCW.', 16, 1)` 将从 "ILikeReadingCPCW." 中删除第16个字符 "C",结果为 "ILikeReadingPCW."。这在处理...
在编程领域,删除字符串中指定的字符是一项常见的操作,它涉及到字符串处理和字符数组的操纵。这个任务可以通过编写一个函数来实现,这个函数接收两个参数:一个字符串和一个要删除的字符。在C语言中,我们可以创建...
本文将深入探讨如何在SCL程序中删除字符串中的特定字符,例如空格,以及相关的重要知识点。 在SCL编程中,字符串操作是常见的任务之一。字符串是由字符组成的序列,可以用来存储和处理文本信息。在处理字符串时,...
2. **数组和字符串**:在C语言中,字符串本质上是字符数组。`char str[80]`定义了一个能存储最多79个字符的数组,用于存储用户输入的字符串。字符串的结束符是`\0`,它不在字符计数之内,因此,`str[79]`可以存放...
1、删除特定字符 特定字符的删除,思路跟插入字符类似。 可以分为两类,删除特定位置的字符 或者 删除指定字符。 1.1、删除特定位置的字符 使用.pop()方法。输入参数,即为要删除的索引。 string = '公众号:土堆碎...
在C++编程中,删除字符串中的特定字符是一项常见的任务,特别是在处理文本数据时。这个任务可以通过递归的方式来实现,这给编程带来了一种优雅而简洁的解决方案。递归是一种解决问题的方法,它通过调用自身来解决更...
在标签“C语言 删除 字符串”中,我们可以推断出我们将重点讨论如何在C语言环境中执行字符串删除操作。 在提供的压缩包文件中,有两个文件:6.c 和 1.6.vsd。6.c 文件很可能是包含实现字符串删除操作的C语言源代码...
在LabView(7.1)中,开发一个程序来清除字符串中的重复字符是一项常见的文本处理任务,这在数据清洗、信息处理或者特定算法实现时可能会用到。本实验的目的是教你如何利用LabView的编程能力,创建一个VI(虚拟仪器...