Leetcode 884. 两句话中的不常见单词
题目:
给定两个句子 A 和 B 。 (句子是一串由空格分隔的单词。每个单词仅由小写字母组成。)
如果一个单词在其中一个句子中只出现一次,在另一个句子中却没有出现,那么这个单词就是不常见的。
返回所有不常用单词的列表。
您可以按任何顺序返回列表。
示例 1:
输入:A = "this apple is sweet", B = "this apple is sour"
输出:["sweet","sour"]
理解:
这是一道简单题目,但是很多地方需要巩固,故记录!
思路很简单:
1.将句子分割成一个一个的单词;
2.统计A和B句子中的各单词数量;
3.寻找其不常见单词。
主要的问题是,如何分割,想到的是split函数,但是C++中如何分割?另外,通缉单次的数量,我们常用的是map结构,如何做?
strtok函数
strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。
该函数包含在"string.h"头文件中
函数原型:
-
char* strtok (char* str,constchar* delimiters );
函数功能:
切割字符串,将str切分成一个个子串
函数参数:
str:在第一次被调用的时间str是传入需要被切割字符串的首地址;在后面调用的时间传入NULL。
delimiters:表示切割字符串(字符串中每个字符都会 当作分割符)。
函数返回值:
当s中的字符查找到末尾时,返回NULL;
如果查不到delimiter所标示的字符,则返回当前strtok的字符串的指针。
插曲:
string和char数组的相互转换:
而char数组转换成string类型,可以直接复制
类似于 A = A1;
使用的时候,处理的字符必须是一个char数组类型,并且不能是指针;
统计的时候,只许设计两个map,分别为map<string,int>,注意,map中是不可以定义指针类型的,因此,map<char*,int>是不对的!
最后在计算的时候,遍历A和B的map中是否符合,用一个vector进行记录结果即可!
具体代码如下:
1 #include<iostream> 2 #include<string> 3 #include <map> 4 #include <vector> 5 using namespace std; 6 int main() 7 { 8 string A,B; 9 //cin >> A >> B; 10 A = "this apple is sweet"; 11 B = "this apple is sour"; 12 //分割 13 vector<string> res; 14 15 char A1[210]; 16 strcpy(A1, A.c_str()); //将string A转化为char* A1[]; 17 18 char B1[210]; 19 strcpy(B1, B.c_str()); 20 map<string, int> ma; 21 map<string, int> mb; 22 string tmp; 23 //统计 24 char *tokenPtr = strtok(A1, " ");//sentence必须是一个char数组,不能是定义成指针形式 25 while (tokenPtr != NULL) { 26 ma[tokenPtr]++; 27 tokenPtr = strtok(NULL, " "); 28 } 29 tokenPtr = strtok(B1, " ");//sentence必须是一个char数组,不能是定义成指针形式 30 while (tokenPtr != NULL) { 31 mb[tokenPtr]++; 32 tokenPtr = strtok(NULL, " "); 33 } 34 //对比 35 //map<string> ma和mb中的不常用单词 36 map<string, int>::iterator it; 37 for (it = ma.begin(); it != ma.end(); it++) 38 { 39 if (it->second == 1 && mb[it->first] == 0) 40 res.push_back(it->first); 41 } 42 43 for (it = mb.begin(); it != mb.end(); it++) 44 { 45 if (it->second == 1 && ma[it->first] == 0) 46 res.push_back(it->first); 47 } 48 49 //输出结果 50 for (int i = 0; i < res.size(); i++) 51 { 52 cout << res[i] << endl; 53 } 54 }
记录,以供学习~~~