LeetCode 1813 句子相似性双指针 HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1813 句子相似性双指针 HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。


解题思路:
非常经典的一道双指针问题,根据题意,相似句子即表示,短的句子可以拆分构成长的句子的头尾,但是要注意,是单词拆分,而不是字符。由于C++中没有直接拆分单词的函数,所以我先想到的是通过字符匹配,方法自然是双指针,分别指向短的句子的头尾,判断是否能够和长的句子的头尾进行匹配,结果是越写越复杂,因为字符匹配的话会有很多的特殊情况,比如匹配的单词不完整,短的句子只有一个单词等等,还不如编写一个单词拆分函数,然后单词匹配呢。所以最终解法如下:

  1. 编写单词拆分函数,利用stringstream把单词一个个放入vector中;
  2. 定义双指针指向短句子的头尾单词;
  3. 两个while循环分别从左往右和从右往左匹配单词;
  4. 最后判断是否覆盖整个短句子。

代码如下:

class Solution 
public:
    bool areSentencesSimilar(string sentence1, string sentence2) 
        int n1 = sentence1.size(), n2 = sentence2.size();
        if(n1 > n2) 
            return areSentencesSimilar(sentence2, sentence1);
        
        vector<string> s1 = split(sentence1);
        vector<string> s2 = split(sentence2);
        n1 = s1.size(), n2 = s2.size();
        int left = 0, right = n1 - 1;
        while(left < n1 && s1[left] == s2[left]) 
            left ++;
        
        while(right >= left && s1[right] == s2[n2 - n1 + right]) 
            right --;
        
        return left + n1 - right - 1 == n1;
    

    vector<string> split(string s) 
        vector<string> ans;
        stringstream ss;
        ss << s;
        while (ss >> s) ans.push_back(s);
        return ans;
    
;

以上是关于LeetCode 1813 句子相似性双指针 HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

“图解”LeetCode 1813. 句子相似性 III

“图解”LeetCode 1813. 句子相似性 III

“图解”LeetCode 1813. 句子相似性 III

LeetCode 1455. 检查单词是否为句中其他单词的前缀 双指针

LeetCode 1455. 检查单词是否为句中其他单词的前缀 双指针

LeetCode 2363. 合并相似的物品:两种方法(哈希 / 排序+双指针)