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) 收藏 举报
浙公网安备 33010602011771号