为啥写这个呢?是因为今天有被HR问道这个问题,但没有手撕,只是说下思路,我打算自己实现一下。
拼写检查程序
题目描述:
请设计一个自动拼写检查函数,对输入单词的错误依据字典进行修正。
- 输入为一个单词和一组字典单词,每个单词长度不超过9位;
- 若字典中没有与输入相同的单词,认为输入单词错误,需要从字典中选择一个修正单词;
- 修正要求:与输入单词长度相同,且单词中不同字符数最少;
- 存在多个修正单词时,取字典中的第一个;
- 输出修正后的单词。
分析:
对于拼写检查的代码,就是只检查你输入的对还是不对,但这个题是要预测用户到底想要输入啥,所以用了个预测的算法
//先进行特殊处理
输入为空指针的情况
//处理
if 输入的字符串长度==字典里的字符串长度
{
for 遍历比较输入的字符串与该字符串的不同字符个数count
if count最小
则此时的字符串就是用户要输出的字符串
}
else
{
输入有误,无法匹配
}
代码:
//拼写检查程序,输出修正后的单词
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
#define MAX_WORD_LEN 9
//比较输入的字符串长度与字典中的字符找出字符不同的个数
int diffCharCount(const char *s1,const char *s2)
{
int count = 0;
while(*s1 != '\0')
{
if(*s1 != *s2)
{
count++;
}
s1++;
s2++;
}
return count;
}
//拼写检查
void FixWord(const char *pInputWord, long lWordLen, const char pWordsDic[][MAX_WORD_LEN], long lDicLen,
char *pOutputWord)
{
//特殊处理
if(pInputWord == nullptr)
{
return;
}
int inputWordLen = strlen(pInputWord);//求输入单词的长度
//处理
//求每个单词的长度
int *wordLen;
wordLen = (int* )malloc(sizeof(int)*lDicLen);
for(int x=0; x<lDicLen; x++)
{
wordLen[x] = strlen(pWordsDic[x]);
}
//比较输入单词与单词表中长度相同的单词
int min = MAX_WORD_LEN;
for(int j=0;j<lDicLen;j++)
{
//若长度相同再比较各个字符是否相同
if(inputWordLen == wordLen[j])
{
//相同直接赋值
if(strcmp(pInputWord, pWordsDic[j]))
{
strcpy(pOutputWord, pInputWord);
}
//否则返回相似度最大的单词
else
{
int temp = diffCharCount(pInputWord, pWordsDic[j]);
//找到这个字符不同数最少的单词就是要输出的单词
if(temp < min)
{
min = temp;
strcpy(pOutputWord, pWordsDic[j]);
}
}
}
//free(wordLen);
}
}
//主函
int main()
{
const char *pInputWord = "hello";
const char pWordsDic[][MAX_WORD_LEN] = {"good", "hello", "world"};
char pOutputWord[MAX_WORD_LEN];
FixWord(pInputWord, 4, pWordsDic, 3, pOutputWord);
cout<<pOutputWord<<endl;
return 0;
}
笔记:
今天的笔记就是这个#include<string.h>
头文件里边的内容,这是一个C标准库,这两天用C++用多了,把C的标准库快忘掉了。
#include<string.h>
头文件里定义了各种操作字符串的函数,很实用。
-
void *memchr(const void *str, int c, size_t n)
在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。
返回为无符号型,因此可以将其进行强制转换成各种其他类型。 -
int memcmp(const void *str1, const void *str2, size_t n)
把 str1 和 str2 的前 n 个字节进行比较。比较的是ascci码值。
返回值
如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str2 小于 str1。
如果返回值 = 0,则表示 str1 等于 str2。 -
void *memcpy(void *dest, const void *src, size_t n)
从 src 复制 n 个字符到 字符数组dest中。
返回也是这个指针dest。
注意:复制完成后的字符串并不包括’\0’,需要自己加上。
这是一些练习的例子:
//string.h库的使用
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char *str = "hello";
char *str1 = "goad";
char *str2 = "gobd";
char x = 'e';
//返回在str中的前strlen(str)个字符中,第一次搜索到字符x的位置
char r1;
r1 = (char)memchr(str, x, strlen(str));
cout<<r1<<endl;
//返回在str中的前strlen(str)个字符中,从字符x开始往后的字符串
char *r2;
r2 = (char*)memchr(str, x, strlen(str));
cout<<r2<<endl;
//返回两个字符串比较之后的大小值
int r3 = memcmp(str1, str2, 3);
cout<<r3<<endl;
//从str22复制3个字符到字符数组str11中
char str11[3];
memcpy(str11, str2, 3);
str11[3] = '\0';
cout<<str11<<endl;
return 0;
}
整几个常用的吧
-
strcmp(const char *str1, const char *str2)
把 str1 所指向的字符串和 str2 所指向的字符串进行比较。int strncmp(const char *str1, const char *str2, size_t n)
把 str1 和 str2 进行比较,最多比较前 n 个字节。 -
char *strcpy(char *dest, const char *src)
把 src 所指向的字符串复制到 dest。char *strncpy(char *dest, const char *src, size_t n)
把 src 所指向的字符串复制到 dest,最多复制 n 个字符。
下来就是觉得会常用,但是还没用过的一些函数
char *strchr(const char *str, int c)
在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
该函数返回在字符串 str 中第一次出现字符 c 的位置,如果未找到该字符则返回 NULL。size_t strlen(const char *str)
计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。
该函数返回字符串的长度。char *strrchr(const char *str, int c)
在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置。
该函数返回 str 中最后一次出现字符 c 的位置。如果未找到该值,则函数返回一个空指针。char *strstr(const char *haystack, const char *needle)
在字符串 haystack 中查找第一次出现字符串 needle(不包含空结束字符)的位置。
该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。