Easy

题目描述

句子 是由单个空格分隔的单词列表,句子没有前导或尾随空格。

  • 例如,"Hello World""HELLO""hello world hello world" 都是句子。

单词仅由大写和小写英文字母组成。大写和小写英文字母视为不同字符。

如果满足下述条件,则认为句子是 环形句子

  • 句子中每个单词的最后一个字符等于下一个单词的第一个字符。
  • 最后一个单词的最后一个字符等于第一个单词的第一个字符。

例如,"leetcode exercises sound delightful""eetcode""leetcode eats soul" 都是环形句子。然而,"Leetcode is cool""happy Leetcode""Leetcode""I like Leetcode" 都不是环形句子。

给你一个字符串 sentence ,请你判断它是否是环形句子。如果是,返回 true ;否则,返回 false

示例 1:

输入:sentence = "leetcode exercises sound delightful"
输出:true
解释:句子中的单词为 ["leetcode", "exercises", "sound", "delightful"] 。
- leetcode 的最后一个字符等于 exercises 的第一个字符。
- exercises 的最后一个字符等于 sound 的第一个字符。
- sound 的最后一个字符等于 delightful 的第一个字符。
- delightful 的最后一个字符等于 leetcode 的第一个字符。
这个句子是环形句子。

示例 2:

输入:sentence = "eetcode"
输出:true
解释:句子中的单词为 ["eetcode"] 。
- eetcode 的最后一个字符等于 eetcode 的第一个字符。
这个句子是环形句子。

示例 3:

输入:sentence = "Leetcode is cool"
输出:false
解释:句子中的单词为 ["Leetcode", "is", "cool"] 。
- Leetcode 的最后一个字符不等于 is 的第一个字符。
这个句子不是环形句子。

提示:

  • 1 <= sentence.length <= 500
  • sentence 仅由小写和大写英文字母和空格组成
  • sentence 中的单词由单个空格分隔
  • 没有前导或尾随空格

解题思路

解题思路

这道题要求判断一个句子是否为环形句子。环形句子的条件是:每个单词的最后一个字符等于下一个单词的第一个字符,且最后一个单词的最后一个字符等于第一个单词的第一个字符。

有两种主要的解题思路:

方法一:分割单词后逐一检查(直观解法)

  1. 将句子按空格分割成单词数组
  2. 遍历每个单词,检查当前单词的最后一个字符是否等于下一个单词的第一个字符
  3. 特别检查最后一个单词的最后一个字符是否等于第一个单词的第一个字符

方法二:直接遍历字符串(推荐解法)

观察发现,我们不需要真正分割单词,只需要在遍历字符串时:

  1. 检查每个空格前后的字符是否相等(即当前单词的最后一个字符与下一个单词的第一个字符)
  2. 检查句子的第一个字符和最后一个字符是否相等

方法二更高效,因为避免了字符串分割的开销,时间和空间复杂度都更优。

对于单个单词的特殊情况,只需要检查首尾字符是否相等即可。

代码实现

class Solution {
public:
    bool isCircularSentence(string sentence) {
        int n = sentence.length();
        
        // 检查句子首尾字符是否相等
        if (sentence[0] != sentence[n - 1]) {
            return false;
        }
        
        // 检查每个空格前后的字符
        for (int i = 1; i < n - 1; i++) {
            if (sentence[i] == ' ') {
                if (sentence[i - 1] != sentence[i + 1]) {
                    return false;
                }
            }
        }
        
        return true;
    }
};
class Solution:
    def isCircularSentence(self, sentence: str) -> bool:
        n = len(sentence)
        
        # 检查句子首尾字符是否相等
        if sentence[0] != sentence[n - 1]:
            return False
        
        # 检查每个空格前后的字符
        for i in range(1, n - 1):
            if sentence[i] == ' ':
                if sentence[i - 1] != sentence[i + 1]:
                    return False
        
        return True
public class Solution {
    public bool IsCircularSentence(string sentence) {
        int n = sentence.Length;
        
        // 检查句子首尾字符是否相等
        if (sentence[0] != sentence[n - 1]) {
            return false;
        }
        
        // 检查每个空格前后的字符
        for (int i = 1; i < n - 1; i++) {
            if (sentence[i] == ' ') {
                if (sentence[i - 1] != sentence[i + 1]) {
                    return false;
                }
            }
        }
        
        return true;
    }
}
var isCircularSentence = function(sentence) {
    const n = sentence.length;
    
    // 检查句子首尾字符是否相等
    if (sentence[0] !== sentence[n - 1]) {
        return false;
    }
    
    // 检查每个空格前后的字符
    for (let i = 1; i < n - 1; i++) {
        if (sentence[i]

复杂度分析

复杂度大小
时间复杂度O(n)
空间复杂度O(1)

其中 n 是句子的长度。算法只需要遍历字符串一次,使用常数额外空间。

相关题目