Cracking the coding interview-String

关于字符串

问题描述:一般这类程序设计的题目较简单,通过设计字符串的反转,寻找子串,以及字符串的拼接、删除操作等问题。

问题

  • 实现一个算法来判断一个字符串中的字符是否唯一(即没有重复)?
  • 设计算法并写出代码移除字符串中重复的字符(不能使用额外的缓存空间)?
  • 写一个函数判断两个字符串是否是变位词?

思路

这三个题目,几乎都要对字符串进行遍历,在遍历中寻求一些逻辑上的计算。

对于第一题,直接遍历判断是否后一个字符和前一个字符是否相同,这样时间复杂度就会很大,相比于把字符的Ascll码直接作为数组的下标,是个不错的选择,这样大大提高了时间效率,不过需要借助一些额外的内存空间。

对于第二题,由于不可以使用额外的缓存空间,则就考虑直接把重复的字符设置标志,然后把没有设置标志的字符输出来,就能达到最后的效果。

对于第三题,需要遍历字符串,统计重复的字符,也可以把他作为一个数组的下标,这样两个额外的数组里的值相同,即就是“变位词”,不同就不是;或者将每个字符串,排序,如果相同,则是“变位词”,如果不同,则不是“变位词”。

需要注意的是:在运用到"char"数组的时候不要忘记了,最后位置上的结束符"\n"。还有就是声明的一个数组,最好事先初始化

主要代码

1、判断字符串中字符是否唯一

//O(n*n)
bool isUnique(string str)	
{
	int i, j;
	int length = str.length();
	for (i = 0; i < length; i++)
	{
		for (j = i + 1; j < length; j++) 
		{
			if (str[i] == str[j])
			{
				return false;
				break;
			}
		}
	}
	if (j == length) return true;
}

//O(n)
bool isUnique1(string str)
{
	int v;
	bool s[256];
	//初始化比较大的数组
	memset(s, 0, sizeof(s));
	int length = str.length();
	for (int i = 0; i < length; i++)
	{
		v = (int)(str[i]);
		if (s[v]) 
		{
			return false;
		}
		s[v] = true;
	}
	return true;
}

2、移除重复字符

void removeDuplicate(char s[])
{
	int length = strlen(s);
	int i, j;
	for (i = 0; i < length; i++)
	{
		for (j = i + 1; j < length; j++)
		{
			if (s[i] == s[j])
			{
				s[j] = ' '; //空格的ascll为32
			}
		}

		if (s[i] != ' ')
		{
			cout << s[i];
		}
	}

	cout << endl;
}

3、字符串是否是变位词

bool isAnagrams1(string a, string b)
{
	if (a == " " || b == " ")
	{
		return false;
	}
	if (a.length() != b.length())
	{
		return false;
	}
	if (a == b)
	{
		return false;
	}
	//sort
	sort(&a[0], &a[0] + a.length());
	sort(&b[0], &b[0] + b.length());

	if (a == b)
	{
		return true;
	}
	else
		return false;
}

bool isAnagrams2(string a, string b)
{
	int c[256];
	memset(c, 0, sizeof(c));

	if (a == "" || b == "")
	{
		return false;
	}

	if (a.length() != b.length())
	{
		return false;
	}

	if (a == b)
	{
		return false;
	}

	for (int i = 0; i < a.length(); i++)
	{
		c[(int)a[i]] += 1;
		c[(int)b[i]] -= 1;
	}

	for (int i = 0; i < 256; i++)
	{
		if (c[i] != 0)
		{
			return false;
			break;
		}
	}

	return true;
}

Note:本文一些思路及题目翻译摘自于http://www.hawstein.com/

posted on 2016-04-28 22:23  dolphinLCJ  阅读(228)  评论(0)    收藏  举报

导航