mah-shamim / leet-code-in-php

Php-based LeetCode algorithm problem solutions, regularly updated.
GNU General Public License v3.0
14 stars 6 forks source link

2490. Circular Sentence #780

Closed mah-shamim closed 2 hours ago

mah-shamim commented 2 hours ago

Discussed in https://github.com/mah-shamim/leet-code-in-php/discussions/779

Originally posted by **mah-shamim** November 2, 2024 **Topics:** `String` A **sentence** is a list of words that are separated by a **single** space with no leading or trailing spaces. - For example, `"Hello World"`, `"HELLO"`, `"hello world hello world"` are all sentences. Words consist of **only** uppercase and lowercase English letters. Uppercase and lowercase English letters are considered different. A sentence is **circular** if: - The last character of a word is equal to the first character of the next word. - The last character of the last word is equal to the first character of the first word. For example, `"leetcode exercises sound delightful"`, `"eetcode"`, `"leetcode eats soul"` are all circular sentences. However, `"Leetcode is cool"`, `"happy Leetcode"`, `"Leetcode"` and `"I like Leetcode"` are **not** circular sentences. Given a string `sentence`, return `_true` if it is circular_. Otherwise, return _`false`_. **Example 1:** - **Input:** sentence = "leetcode exercises sound delightful" - **Output:** true - **Explanation:** The words in sentence are ["leetcode", "exercises", "sound", "delightful"]. - leetcode's last character is equal to exercises's first character. - exercises's last character is equal to sound's first character. - sound's last character is equal to delightful's first character. - delightful's last character is equal to leetcode's first character. The sentence is circular. **Example 2:** - **Input:** sentence = "eetcode" - **Output:** true - **Explanation:** The words in sentence are ["eetcode"]. - eetcode's last character is equal to eetcode's first character. The sentence is circular. **Example 3:** - **Input:** sentence = "Leetcode is cool" - **Output:** false - **Explanation:** The words in sentence are ["Leetcode", "is", "cool"]. - Leetcode's last character is not equal to is's first character. The sentence is not circular. **Constraints:** - `1 <= sentence.length <= 500` - `sentence` consist of only lowercase and uppercase English letters and spaces. - The words in `sentence` are separated by a single space. - There are no leading or trailing spaces. **Hint:** 1. Check the character before the empty space and the character after the empty space. 2. Check the first character and the last character of the sentence.
mah-shamim commented 2 hours ago

We need to verify two conditions:

  1. Each word’s last character should match the next word’s first character.
  2. The last character of the final word should match the first character of the first word, making it circular.

Let's implement this solution in PHP: 2490. Circular Sentence

<?php
/**
 * @param String $sentence
 * @return Boolean
 */
function isCircularSentence($sentence) {
    // Split the sentence into words
    $words = explode(" ", $sentence);

    // Loop through the words and check the circular condition
    for ($i = 0; $i < count($words); $i++) {
        // Get the last character of the current word
        $lastChar = substr($words[$i], -1);

        // Determine the next word (wrap around if we're at the last word)
        $nextWord = $words[($i + 1) % count($words)];

        // Get the first character of the next word
        $firstChar = substr($nextWord, 0, 1);

        // Check if the last character of the current word matches the first character of the next word
        if ($lastChar !== $firstChar) {
            return false;
        }
    }

    return true;
}

// Test cases
$sentence1 = "leetcode exercises sound delightful";
$sentence2 = "eetcode";
$sentence3 = "Leetcode is cool";

echo isCircularSentence($sentence1) ? "true\n" : "false\n"; // Output: true
echo isCircularSentence($sentence2) ? "true\n" : "false\n"; // Output: true
echo isCircularSentence($sentence3) ? "true\n" : "false\n"; // Output: false
?>

Explanation:

  1. Splitting the Sentence: Use explode(" ", $sentence) to split the sentence into words.
  2. Looping through Words:
    • For each word, get its last character using substr($words[$i], -1).
    • Get the first character of the next word. For the last word, we use modulo (%) to wrap around to the first word.
  3. Comparison:
    • If the last character of a word doesn’t match the first character of the next word, return false.
    • If the loop completes without finding any mismatch, the sentence is circular, so return true.

This code efficiently checks the circular condition for each word pair, making it simple and optimal.