前言
原文请查看:《算法零基础100讲》字符串算法
剑指 Offer 05. 替换空格
原题链接:剑指 Offer 05. 替换空格
分析
我的做法是先统计空格个数,再决定申请空间的大小。 然后遍历字符串,如果遇到空格,就将其替换。
代码
char* replaceSpace(char* s)
{
if(NULL == s) return NULL;
int count = 0;
for (int i = 0; i < strlen(s); ++i)
{
if (s[i] == ' ')
count++;
}
char* ans = (char*)malloc(sizeof(char) * strlen(s) + count * 2 + 1);
int i = 0, j = 0;
for (i; i < strlen(s); ++i, ++j)
{
ans[j] = s[i];
if (s[i] == ' ')
{
ans[j++] = '%';
ans[j++] = '2';
ans[j] = '0';
}
}
ans[j] = '\0';
return ans;
}
面试题 10.05. 稀疏数组搜索
原题链接:面试题 10.05. 稀疏数组搜索
分析
遍历字符串数组,然后 直接使用库函数(滑稽)。。。
代码
int findString(char** words, int wordsSize, char* s)
{
for (int i = 0; i < wordsSize; ++i)
{
if (strcmp(s, words[i]) == 0)
{
return i;
}
}
return -1;
}
1309. 解码字母到整数映射
原题链接:1309. 解码字母到整数映射
分析
动态申请一个新的字符串,再声明一个表示下标的变量。 遍历原字符串,判断正在遍历的下标和字符串长度的关系,如果满足小于字符串长度,再判断该下标往后2个位置是否为 ‘#’,是的话就将其改为 " j~z";否则改成 " a ~ i"。。
代码
char * freqAlphabets(char * s)
{
char* str = (char*)malloc(sizeof(char) * strlen(s) + 1);
int strSize = 0;
for (int i = 0; i < strlen(s); ++i)
{
if (i + 2 < strlen(s) && s[i + 2] == '#')
{
str[strSize++] = ((s[i] - '0') * 10 + (s[i + 1] - '1') + 'a');
i += 2;
}
else
{
str[strSize++] = s[i] - '1' + 'a';
}
}
str[strSize] = '\0';
return str;
}
1967. 作为子字符串出现在单词中的字符串数目
原题链接:1967. 作为子字符串出现在单词中的字符串数目
分析
直接使用库函数 strstr
函数原型:
char* strstr(char* str1, char* str2);
意义:找出在字符串str1中 第一次出现字符串str2的位置(即str2如果是str1的子串),找到就返回该字符串位置的指针,不存在则返回 NULL。
代码
int numOfStrings(char ** patterns, int patternsSize, char * word)
{
int count = 0;
for (int i = 0; i < patternsSize; ++i)
{
if (strstr(word, patterns[i]))
{
count++;
}
}
return count;
}
练习题
原题链接:290. 单词规律
|