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

来源:互联网 发布:去除数据中的噪声 编辑:程序博客网 时间:2024/05/22 05:44

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


原创粉丝点击