1.4 Write a method to decide if two strings are anagrams or not.
译文:写一个函数判断是否两个字符串为变位词。变位词就是两个字符串中的字符相同,只是位置不同
这里似乎又涉及到了字符的重复问题,通过前面几个小节的说明,可以借助一个数组来表征字符的出现,不过这里是两个字符串,我们可以采用同一个数组,对一个字符串中的字符出现来设置数组中的对应位置加1,对另一个字符串则相应位置减1,有点类似于C++中的智能指针,最后来判断这个数组是否为空,为空,表示为变位词,否则不是。代码
bool isAnagrams(string str, string dst)
{
if ((str.length() != dst.length()) || (0 == str.length()))
return false;
int len = str.length();
int a[256];
memset(a, 0, sizeof(a));
for (int i = 0; i < len; ++i)
{
++a[(int)str[i]];
--a[(int)dst[i]];
}
for (int i = 0; i < 256; ++i)
{
if (a[i] != 0)
return false;
}
return true;
}
另外也可以对字符串中的字符进行排序,然后比较两个字符串,如果相同则是变位词,否则不是。
可以借助标准库中的排序算法直接对字符串进行排序。这里还是贴一下快排的代码
int Partition(char s[], int left, int right)
{
int pivot = s[left];
while (left < right)
{
while (left < right && s[right] > pivot) //两种情况跳出循环
--right;
s[left] = s[right]; //left == right时亦满足
while (left < right && s[left] <= pivot)
++left;
s[right] = s[left]; //left不断变化
}
s[left] = pivot;
return left;
}
void QuickSort(char s[], int left, int right)
{
if (left < right)
{
int i = Partition(s, left, right);
QuickSort(s, left, i - 1);
QuickSort(s, i + 1, right);
}
}
bool isAnagrams(string str, string dst)
{
if ((str.length() != dst.length()) || (0 == str.length()))
return false;
int len = str.length();
QuickSort(&str[0], 0, len - 1);
QuickSort(&dst[0], 0, len - 1);
if (str == dst)
return true;
else
return false;
}
相比第一种方法这看起来复杂点,这里只是提供一下思路,不过借助库函数中的排序函数sort会很简洁。
1.5 Write a method to replace all spaces in a string with ‘%20’.
译文:写一个函数将字符串中的所有空格用‘%20’替换。这道题其实就是 URL中的空格替换为 %20。
一个空格占一个字符位,‘%20’占用3个字符位,所以替换后需要更大的空间,这不得不另外开辟一个更大的数组空间来存放。首先得遍历一遍字符串,计算出字符串中空格的个数,然后针对每个空格需要额外添加2个字符空间开辟一个新的数组,代码
char* replace_space(char *str)
{
if (NULL == str)
return NULL;
int len = strlen(str);
if (len < 1)
return NULL;
int cnt = 0;
for (int i = 0; i < len; ++i)
{
if (' ' == str[i])
cnt++;
}
char *dst = new char[len + 2*cnt + 1];
int p = len + 2 * cnt;
dst[p--] = '\0';
for (int i = len - 1; i >= 0; --i) //从后往前
{
if (' ' == str[i])
{
dst[p] = '0';
dst[p - 1] = '2';
dst[p - 2] = '%';
p -= 3;
}
else
{
dst[p--] = str[i];
}
}
return dst;
}
值得注意的是,将字符串放到另外一个数组中时,需要从后面往前面遍历。