Chapter 1 | Arrays and Strings--判断变位词和字符串空格替换为‘ ’

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;
}
值得注意的是,将字符串放到另外一个数组中时,需要从后面往前面遍历。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值