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中包含的分割字符时,则会将该字符改为 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针 

  该函数包含在"string.h"头文件中
  函数原型:

  1. 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 }

  记录,以供学习~~~

原文地址:https://www.cnblogs.com/cnyulei/p/11934098.html