待字闺中之删除字符分析

删除字符串中的“b”和“ac”,需要满足如下的条件:

1. 字符串只能遍历一次

2. 不能够使用额外的空间

例如:

1. acbac   ==>  ""

2. aaac    ==>  aa

3. ababac  ==>  aa

4. bbbbd   ==>  d

进一步思考:如何处理aaccac呢,需要做哪些改变呢?

分析

首先要明白从字符串中删除某些字符该如何实现,显而易见我们可以把保留的字符拷贝新的字符串中来实现删除。但是题目要求不能使用额外的空间。那就是将要删除的字符全部交换到字符串的尾部,然后设置一个‘\0‘表示字符串的结尾。

其次,如果要删除的都是单个字符的字符串,就很直接:我们使用i和j两个变量遍历字符串,i表示不会删除的字符的位置,j从0开始,只要i所在位置 的字符不是要删除的字符,就str[j]=str[i](str表示字符串),然后j++指向下一个位置。一次遍历即可,不需要额外申请空间,只需要两个 变量。

但是,现在删除的字符串中有多个字符的,如:“ac”。那要如何处理呢?这里介绍一个小技巧:状态机。这里,我们有两个状态:ONE和TWO。TWO表示,前一个字符时‘a’的状态,其他的都用ONE表示。还是采用前面所描述的遍历方法:

1. 如果当前状态为ONE,则拷贝:str[j]=str[i];但如果当前字符满足以下两种状态的任一个,则不进行拷贝:

    1. 当前字符是‘b’,因为我们要删除b

    2. 当前字符是‘a’,我们要考虑下一个字符是c

2. 如果当前状态为TWO:

    1. 当前字符不是‘c’,那么我们要先拷贝前一个字符‘a’

    2. 然后考虑当前字符,如果不是‘b’或者‘a’,则拷贝字符

状态转换非常简单,就是每次都检查,是前一个字符为‘a’。基本代码如下:

void stringFilter(char* str)
{
	int i,j=0,length = strlen(str),STATE = 1;
	for (i = 0;i < length;i++)
	{
		//状态为ONE的情况
		if (STATE == 1 && str[i] != 'a' && str[i] != 'b')
		{
			str[j++] = str[i];
		}
		//状态为TWO的情况
		else if (STATE == 2 && str[i] != 'c')
		{
			str[j++] = 'a';
			if (str[i] != 'a' && str[i] != 'b')
			{
				str[j++] = str[i];
			}
		}
		//跟新当前状态
		STATE = str[i] == 'a' ? 2 : 1;

		//如果需要删除不连续的ac,则打开
		//if (j > 1 && str[j-2] == 'a' && str[j-1] == 'c') j -= 2;
	}
	if(STATE == 2)str[j++] = 'a';
	str[j] = '\0';
}

下面进一步考虑: 根据上面的算法,我们考虑aaccac,最终得到ac。ac在题目中要求的也是要删除的。是否要删除这个ac,就需要和面试官进行交流了,无论如何,总是
要考虑这种情况。还是采用上面的算法,怎么解决删除之后还可以删除的情况?只要把循环最后的代码注释去调即可

时间: 2024-12-19 21:09:31

待字闺中之删除字符分析的相关文章

Backspace不能删除字符而只是显示^H问题

问题描述:在tclsh中,当试图用Backspace键删除字符时,并没有删除光标前一个字符,而是显示^H.解决办法:键入”stty erase ^H”命令即可.问题分析:这个问题并不是tclsh特有的,很多程序都可能存在这个问题.根源在于tclsh程序做行编辑之类操作,并不是使用readline库,而是依赖于终端.因此我们可以通过stty对终端重新配置来解决这个问题.当使用readline时,终端处于raw模式,readline自己来解释backspace.delete.箭头等特殊字符:当不使用

最少插入字符分析

题目来源,待字闺中,原创@陈利人 ,欢迎大家继续关注微信公众账号"待字闺中" 原题给定字符串,可以通过插入字符,使其变为回文.求最少插入字符的数量.例如: 1. ab最少插入1个字符,变为*b*ab 2. aa最少插入0个字符 3. abcd最少插入3个字符,*dcb*abcd 分析:根据回文串的定义,很容易获得递归思路,首先比较第一个和最后一个字符,相等则插入个数等于中间的插入个数,不等,则可以通过在开头或最后添加一个字符,使得两头相等,比如abcd可以转化为abcda或dabcd,

【剑指offer】删除字符也出现在一个字符串

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27110873 剑指offer上的字符串相关题目. 题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符.比如.输入"They are students."和"aeiou",则删除之后的第一个字符串变成"Thy r stdnts.". 这里主要要分析两个方面: 1.怎样推断那些字符是须要删除的字符. 同非常多字符串问题一样.能够

待字闺中之interleave字符串分析

题目来源,待字闺中,原创@陈利人 ,欢迎大家继续关注微信公众账号"待字闺中" 3个字符串a,b,c.判断c是否是a和b的interleave,也就是c中应该有a,b中所有字 符,并且c中字符顺序和a,b中一样.比如, 1. a = "ef" b = "gh" c = "egfh" return true: 2. a = "ef" b = "gh" c = "ehgf"

待字闺中之逆序分析

题目来源,待字闺中,原创@陈利人 ,欢迎大家继续关注微信公众账号"待字闺中" 一个整数,可以表示为二进制的形式,请给出尽可能多的方法对二进制进行逆序操作. 例如:10000110 11011000的逆序为 00011011 01100001 分析:题目中说是一个整数,对它的二进制进行逆序.并不是一个01字符串,或者01的数组.那么我们该如何解决这个问题呢?方法还是比较多的,有的中规中矩.有的非常巧妙.我们要掌握中规中规的方法,见识更多的巧妙的方法.慢慢的,能够举一反三,在遇到新的问题时

待字闺中之Magic Index 分析

给定一个数组A,其中有一个位置被称为Magic Index,含义是:如果i是Magic Index,则A[i] = i.假设A中的元素递增有序.且不重复,请给出方法,找到这个Magic Index.更进一步,当A中允许有重复的元素,该怎么办呢? 没有重复元素的情况 一些同学在遇到这个题目的时候,往往会觉得比较简单.扫描一遍,不就ok了么?O(n)的.很简单呀.可是,大家要注意到,还有一个条件没有用:A中的元素是有序递增的.这个条件,并不是放在这里迷惑大家的,而是有更大的作用的.这个时候,该如何想

tr转换或删除字符

字符处理命令:tr —— 转换或删除字符 逐个字符处理而不是处理单词的tr [OPTION]... SET1 [SET2]    -d: 删除出现在字符集中的所有字符 tr ab AB

待字闺中之死亡小岛分析

一个小岛,表示为一个N×N的方格,从(0,0)到(N-1, N-1),一个人站在岛上,位置(x, y),他可以上下左右走,一步一个格子,他选择上下左右的可能性是一样的.当他走出小岛,就意味着死亡.假设他要走n步,请问他死亡的概率有多大?请写出求解代码. 分析 遇到这样的问题,就试着走几步好了.当一个人在(x,y)的时候,假设他此时,死亡的概率为p(x,y,n),然后,他有四种选择,而且是可能性相同,就是说,选择上下左右的概率都是1/4: 选择上边,死亡的概率是多少呢?此时位置为(x, y-1),

android EditText获取光标位置并安插字符删除字符

android EditText获取光标位置并插入字符删除字符1.获取光标位置int index = editText.getSelectionStart(); 2.在光标处插入字符int index = editText.getSelectionStart();Editable editable = editText.getText();editable.insert(index, "aaaa");3.删除光标前字符int index = editText.getSelectionS