Sentence Similarity III

Updated on 11 July, 2025
Sentence Similarity III header image

Problem Statement

In the given problem, you are provided with two strings, sentence1 and sentence2. Each of these strings represents a sentence composed of words. These words are separated by single spaces without any leading or trailing spaces. Each word is made up entirely of uppercase and lowercase English letters.

The core of the problem is to determine if two given sentences are similar. Two sentences are considered similar if you can insert a sentence (which could be empty or comprise multiple words separated by spaces) at any position within one of the sentences to make both sentences exactly the same. This inserted sentence must be separated from the adjacent words in the original sentence by spaces.

Several examples have been provided to clarify the concept:

  • Two sentences, one being "Hello Jane" and the other being "Hello my name is Jane" can be seen as similar because by inserting the phrase "my name is" between "Hello" and "Jane" in the first sentence, both sentences become identical.
  • Two sentences "Frog cool" and "Frogs are cool", however, are not similar. Even though one sentence can be converted to the other by inserting 's are', this adjustment would require altering existing words rather than simply inserting a separate sentence between them. Thus, they do not meet the criteria for being similar.

The task is to determine whether two provided sentences are similar based on the above rules and to return true if they are and false otherwise.

Examples

Example 1

Input:

sentence1 = "My name is Haley", sentence2 = "My Haley"

Output:

true

Explanation:

`sentence2` can be turned to `sentence1` by inserting "name is" between "My" and "Haley".

Example 2

Input:

sentence1 = "of", sentence2 = "A lot of words"

Output:

false

Explanation:

No single sentence can be inserted inside one of the sentences to make it equal to the other.

Example 3

Input:

sentence1 = "Eating right now", sentence2 = "Eating"

Output:

true

Explanation:

`sentence2` can be turned to `sentence1` by inserting "right now" at the end of the sentence.

Constraints

  • 1 <= sentence1.length, sentence2.length <= 100
  • sentence1 and sentence2 consist of lowercase and uppercase English letters and spaces.
  • The words in sentence1 and sentence2 are separated by a single space.

Approach and Intuition

To determine whether two sentences are similar, the ideal approach entails several steps:

  1. Split both sentence1 and sentence2 into arrays of words. This allows for easier manipulation and comparison of individual segments (words) of the given sentences.

  2. Use a two-pointer technique:

    • Initialize two pointers, let's call them left and right.
    • Start left at the beginning of both word arrays and advance if the words at the current position of both arrays match. This finds the initial sequence of common words from the start.
    • Set right at the end of both arrays and move backwards, comparing words like you did with left but from the opposite end. This is for finding common words from the end.
  3. The critical check post two-pointer comparison involves checking if the remaining middle section of the longer sentence (if any) can stand alone as a coherent insert:

    • If the two-pointer technique exhausts one complete sentence while there are still unmatched words in the other, then the unmatched segment can be considered as an insertable sentence.
    • If neither sentence has any remaining words left to compare or if any unmatched words are effectively surrounded by matched ones in the other sentence, then the sentences are similar by definition of possible insertion.

Through these steps, the task resolves into checking alignments and possible insert positions, classifying the given sentences as similar based on laid out criteria in the problem statement.

Solutions

  • C++
cpp
class Solution {
public:
    bool sentencesSimilar(string sentence1, string sentence2) {
        stringstream stream1(sentence1), stream2(sentence2);
        string token;
        vector<string> words1, words2;
        while (stream1 >> token) words1.push_back(token);
        while (stream2 >> token) words2.push_back(token);
    
        int i = 0, end1 = words1.size() - 1, end2 = words2.size() - 1;
    
        if (words1.size() > words2.size()) return sentencesSimilar(sentence2, sentence1);
    
        while (i < words1.size() && words1[i] == words2[i])
            ++i;
    
        while (end1 >= 0 && words1[end1] == words2[end2]) {
            --end1;
            --end2;
        }
    
        return end1 < i;
    }
};

The C++ solution provided assesses the similarity between two sentences by comparing individual words at the beginning and the end of each sentence. The approach involves the following steps:

  1. A string stream for each sentence breaks the strings into words, which are stored in a vector<string> for both sentences.
  2. Initialize two pointers, i to the beginning and end1, end2 to the end of the respective word lists.
  3. Ensure that the smaller sentence is always sentence1 for consistency in comparison, using recursive strategy if necessary.
  4. Increment the start pointer i while the words at the start of both sentences match.
  5. Decrement the end pointers end1 and end2 while the words at the end of both sentences match.
  6. Confirm similarity if the end pointer of the first list end1, after adjustments, is less than the start pointer i. This condition indicates that all words from the smaller sentence (words1) are matched in sequence within words2.

This solution effectively checks if one sentence can be made identical to the other by only inserting words at the beginning and/or the end, thus confirming the sentence similarity in terms of structure and composition.

  • Java
java
class Solution {
    
    public boolean checkSimilarSentences(String sentence1, String sentence2) {
        String[] words1 = sentence1.split(" "), words2 = sentence2.split(" ");
        int first = 0, last1 = words1.length - 1, last2 =
            words2.length - 1, len1 = words1.length, len2 =
            words2.length;
    
        if (len1 > len2) {
            return checkSimilarSentences(sentence2, sentence1);
        }
    
        while (first < len1 && words1[first].equals(words2[first])) {
            ++first;
        }
            
        while (last1 >= 0 && words1[last1].equals(words2[last2])) {
            --last1;
            --last2;
        }
    
        return last1 < first;
    }
}

The given Java program aims to determine if two sentences are similar based on their structure. This similarity isn't an exact word-by-word match but allows some words to differ. This process, implemented in the checkSimilarSentences method, can be understood as follows:

  • First, both input sentences (sentence1 and sentence2) are split into arrays of words (words1 and words2).
  • The method initializes variables to manage indices: first to track the starting comparison index, last1 and last2 to track the ending indices of both word arrays, and len1 and len2 as the lengths of these arrays.

If sentence1 is longer than sentence2, the method recalibrates by swapping the sentences and calling itself recursively. This ensures that sentence1 is always the shorter sentence or they are of the same length.

  • The method then uses two while loops:
    • The first loop increases first as long as words at the corresponding indices in both word arrays match.
    • The second loop decreases last1 and last2 as long as words from the end of both word arrays match.

After adjusting first, last1, and last2 through the loops:

  • The method concludes by checking if last1 is less than first. If true, it implies that the mismatched segment (if any) in the longer sentence either doesn't exist or is sandwiched in a position where matching words are both before and after this segment, thus, determining the sentences as similar.
  • Python
python
class Solution:
    def compareSentences(self, sentence1: str, sentence2: str) -> bool:
        # Split sentences into words
        words1 = sentence1.split(" ")
        words2 = sentence2.split(" ")
        start, end1, end2 = 0, len(words1) - 1, len(words2) - 1
    
        # Swap for comparison if length of first is greater
        if len(words1) > len(words2):
            return self.compareSentences(sentence2, sentence1)
    
        # Compare words from beginning of sentences
        while start < len(words1) and words1[start] == words2[start]:
            start += 1
    
        # Compare words from end of sentences
        while end1 >= 0 and words1[end1] == words2[end2]:
            end1 -= 1
            end2 -= 1
    
        # Check if all words matched
        return end1 < start

This Python solution defines a method compareSentences within the Solution class, which checks if two provided sentences are similar according to specific rules. The method accepts two strings, sentence1 and sentence2, and follows these steps to determine similarity:

  1. Split both sentences into lists of words.
  2. Determine initial positions for comparison: start at the beginning and end1, end2 at the ends of the respective word lists.
  3. If the first sentence has more words than the second, the method calls itself with the sentences reversed to ensure that the first sentence is not longer than the second.
  4. Iteratively compare corresponding words from the start. Increment the start index as long as the words at the current start index match in both sentences.
  5. Similarly, compare words from the end of both lists backwards and adjust the end1 and end2 indices as long as the words match.
  6. The sentences are considered similar if, after this comparison from both ends, the end1 index is less than the start index, indicating that all words matched within overlapping indices.

This approach leverages early exit for efficiency when mismatches occur either at the beginning or end, ensuring the algorithm performs optimally by reducing unnecessary comparisons.

Comments

No comments yet.